discuss@lists.openscad.org

OpenSCAD general discussion Mailing-list

View all threads

No longer able to use STLs

RW
Rogier Wolff
Mon, Apr 20, 2020 10:35 AM

On Mon, Apr 20, 2020 at 09:43:58AM +0100, nop head wrote:

The STL has to be perfect for OpenSCAD to accept it. No degenerate
triangles and no self intersections.

I think the CGAL errors are 100% right about the mesh passed to it. I.e. no
false positives but because OpenSCAD snaps everything to a grid it can't
have very close vertices or snapping them will cause degenerate triangles
and self intersections.

I would think that a pass through the list-of-triangles looking for
the zero-area triangles is easy... There is this cross-product-vector
that would normally give you a normal. If that becomes zero, you have
a zero-area triangle: The points are on one line.

To repair: If two points are the same, remove this triangle. Done.

Otherwise they are on a single line.
call the points p1, p2, p3.

Find alpha such that p3 = p1 + alpha (p2-p1);
If 0 < alpha < 1, p3 is the middle point.
If alpha < 0,  p1 is the middle point.
If alpha > 1,  p2 is the middle point .

Now... look for triangles that include p1, p2, and p3. You should find
two that include the middle point. Delete one and adjust the other to
use both outer points.

There is also a triangle that includes just the outer two points. That
one can be left alone.

If the source file to an STL import is invalid, I find it excusable
not to "fix" broken input files. But once openscad snaps-to-grid and
CAUSES these problems it would be very much appropriate to attempt to
fix such issues.

Just my humble opinion.....

Roger.

On Mon, 20 Apr 2020 at 05:34, guaranteed_interwoven kerryhall@gmail.com
wrote:

Thank you! I installed angelcad and it worked perfectly.

I am 100% happy with an STL repair tool.

Thank you everyone for your help here!

--
Sent from: http://forum.openscad.org/


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

--
** R.E.Wolff@BitWizard.nl ** https://www.BitWizard.nl/ ** +31-15-2049110 **
**    Delftechpark 11 2628 XJ  Delft, The Netherlands.  KVK: 27239233    **
The plan was simple, like my brother-in-law Phil. But unlike
Phil, this plan just might work.

On Mon, Apr 20, 2020 at 09:43:58AM +0100, nop head wrote: > The STL has to be perfect for OpenSCAD to accept it. No degenerate > triangles and no self intersections. > > I think the CGAL errors are 100% right about the mesh passed to it. I.e. no > false positives but because OpenSCAD snaps everything to a grid it can't > have very close vertices or snapping them will cause degenerate triangles > and self intersections. I would think that a pass through the list-of-triangles looking for the zero-area triangles is easy... There is this cross-product-vector that would normally give you a normal. If that becomes zero, you have a zero-area triangle: The points are on one line. To repair: If two points are the same, remove this triangle. Done. Otherwise they are on a single line. call the points p1, p2, p3. Find alpha such that p3 = p1 + alpha (p2-p1); If 0 < alpha < 1, p3 is the middle point. If alpha < 0, p1 is the middle point. If alpha > 1, p2 is the middle point . Now... look for triangles that include p1, p2, and p3. You should find two that include the middle point. Delete one and adjust the other to use both outer points. There is also a triangle that includes just the outer two points. That one can be left alone. If the source file to an STL import is invalid, I find it excusable not to "fix" broken input files. But once openscad snaps-to-grid and CAUSES these problems it would be very much appropriate to attempt to fix such issues. Just my humble opinion..... Roger. > On Mon, 20 Apr 2020 at 05:34, guaranteed_interwoven <kerryhall@gmail.com> > wrote: > > > Thank you! I installed angelcad and it worked perfectly. > > > > I am 100% happy with an STL repair tool. > > > > Thank you everyone for your help here! > > > > > > > > -- > > Sent from: http://forum.openscad.org/ > > > > _______________________________________________ > > OpenSCAD mailing list > > Discuss@lists.openscad.org > > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org > > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org -- ** R.E.Wolff@BitWizard.nl ** https://www.BitWizard.nl/ ** +31-15-2049110 ** ** Delftechpark 11 2628 XJ Delft, The Netherlands. KVK: 27239233 ** The plan was simple, like my brother-in-law Phil. But unlike Phil, this plan just might work.
NH
nop head
Mon, Apr 20, 2020 10:39 AM

I created a PR that fixed the degenerate triangles. OpenSCAD
already removes the single point ones but I added removing the needles and
darts with the edge flipping. Problem is the snapping also creates self
intersection just as often I don't know an easy way of fixing those.

On Mon, 20 Apr 2020 at 11:36, Rogier Wolff R.E.Wolff@bitwizard.nl wrote:

On Mon, Apr 20, 2020 at 09:43:58AM +0100, nop head wrote:

The STL has to be perfect for OpenSCAD to accept it. No degenerate
triangles and no self intersections.

I think the CGAL errors are 100% right about the mesh passed to it. I.e.

no

false positives but because OpenSCAD snaps everything to a grid it can't
have very close vertices or snapping them will cause degenerate triangles
and self intersections.

I would think that a pass through the list-of-triangles looking for
the zero-area triangles is easy... There is this cross-product-vector
that would normally give you a normal. If that becomes zero, you have
a zero-area triangle: The points are on one line.

To repair: If two points are the same, remove this triangle. Done.

Otherwise they are on a single line.
call the points p1, p2, p3.

Find alpha such that p3 = p1 + alpha (p2-p1);
If 0 < alpha < 1, p3 is the middle point.
If alpha < 0,  p1 is the middle point.
If alpha > 1,  p2 is the middle point .

Now... look for triangles that include p1, p2, and p3. You should find
two that include the middle point. Delete one and adjust the other to
use both outer points.

There is also a triangle that includes just the outer two points. That
one can be left alone.

If the source file to an STL import is invalid, I find it excusable
not to "fix" broken input files. But once openscad snaps-to-grid and
CAUSES these problems it would be very much appropriate to attempt to
fix such issues.

Just my humble opinion.....

     Roger.

On Mon, 20 Apr 2020 at 05:34, guaranteed_interwoven <kerryhall@gmail.com

wrote:

Thank you! I installed angelcad and it worked perfectly.

I am 100% happy with an STL repair tool.

Thank you everyone for your help here!

--
Sent from: http://forum.openscad.org/


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

--
** R.E.Wolff@BitWizard.nl ** https://www.BitWizard.nl/ ** +31-15-2049110
**
**    Delftechpark 11 2628 XJ  Delft, The Netherlands.  KVK: 27239233    **
The plan was simple, like my brother-in-law Phil. But unlike
Phil, this plan just might work.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

I created a PR that fixed the degenerate triangles. OpenSCAD already removes the single point ones but I added removing the needles and darts with the edge flipping. Problem is the snapping also creates self intersection just as often I don't know an easy way of fixing those. On Mon, 20 Apr 2020 at 11:36, Rogier Wolff <R.E.Wolff@bitwizard.nl> wrote: > On Mon, Apr 20, 2020 at 09:43:58AM +0100, nop head wrote: > > The STL has to be perfect for OpenSCAD to accept it. No degenerate > > triangles and no self intersections. > > > > I think the CGAL errors are 100% right about the mesh passed to it. I.e. > no > > false positives but because OpenSCAD snaps everything to a grid it can't > > have very close vertices or snapping them will cause degenerate triangles > > and self intersections. > > I would think that a pass through the list-of-triangles looking for > the zero-area triangles is easy... There is this cross-product-vector > that would normally give you a normal. If that becomes zero, you have > a zero-area triangle: The points are on one line. > > To repair: If two points are the same, remove this triangle. Done. > > Otherwise they are on a single line. > call the points p1, p2, p3. > > Find alpha such that p3 = p1 + alpha (p2-p1); > If 0 < alpha < 1, p3 is the middle point. > If alpha < 0, p1 is the middle point. > If alpha > 1, p2 is the middle point . > > Now... look for triangles that include p1, p2, and p3. You should find > two that include the middle point. Delete one and adjust the other to > use both outer points. > > There is also a triangle that includes just the outer two points. That > one can be left alone. > > If the source file to an STL import is invalid, I find it excusable > not to "fix" broken input files. But once openscad snaps-to-grid and > CAUSES these problems it would be very much appropriate to attempt to > fix such issues. > > Just my humble opinion..... > > Roger. > > > > > On Mon, 20 Apr 2020 at 05:34, guaranteed_interwoven <kerryhall@gmail.com > > > > wrote: > > > > > Thank you! I installed angelcad and it worked perfectly. > > > > > > I am 100% happy with an STL repair tool. > > > > > > Thank you everyone for your help here! > > > > > > > > > > > > -- > > > Sent from: http://forum.openscad.org/ > > > > > > _______________________________________________ > > > OpenSCAD mailing list > > > Discuss@lists.openscad.org > > > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org > > > > > > _______________________________________________ > > OpenSCAD mailing list > > Discuss@lists.openscad.org > > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org > > > -- > ** R.E.Wolff@BitWizard.nl ** https://www.BitWizard.nl/ ** +31-15-2049110 > ** > ** Delftechpark 11 2628 XJ Delft, The Netherlands. KVK: 27239233 ** > The plan was simple, like my brother-in-law Phil. But unlike > Phil, this plan just might work. > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >
RW
Rogier Wolff
Mon, Apr 20, 2020 11:43 AM

On Mon, Apr 20, 2020 at 11:39:51AM +0100, nop head wrote:

I created a PR that fixed the degenerate triangles. OpenSCAD
already removes the single point ones but I added removing the needles and
darts with the edge flipping. Problem is the snapping also creates self
intersection just as often I don't know an easy way of fixing those.

I've been thinking about it a bit between hitting send on the below email
and now...

You'd have to find the vector representation of the intersection line
between the two planes of the two triangles. Then, for the each three
edges of one of the triangles again find the alpha like below, and if
you find any alpha 0<alpha<1, then the intersection between the planes
happens inside the triangle: the intersection line crosses one edge
(it'll intersect with precisely two edges).

Now you've FOUND the self-intersection.... I haven't figured out yet
what to do next....

This "check for self-intersection" however is much more expensive than
the degenerate triangles check: The natural way to do it will be
quadratic: check every triangle against every other. A heuristic would
be to create "bins" for voxels and then put each triangle in those
bins that it could touch. If your voxels are fine enough so that you
don't get too many triangles in each voxel, that would significantly
reduce the number of checks when there are lots and lots of triangles.
(similarly you don't want the voxels too small: Then you get lots of
triangles that touch many voxels.)

Roger.

On Mon, 20 Apr 2020 at 11:36, Rogier Wolff R.E.Wolff@bitwizard.nl wrote:

Otherwise they are on a single line.
call the points p1, p2, p3.

Find alpha such that p3 = p1 + alpha (p2-p1);
If 0 < alpha < 1, p3 is the middle point.
If alpha < 0,  p1 is the middle point.
If alpha > 1,  p2 is the middle point .

--
** R.E.Wolff@BitWizard.nl ** https://www.BitWizard.nl/ ** +31-15-2049110 **
**    Delftechpark 11 2628 XJ  Delft, The Netherlands.  KVK: 27239233    **
The plan was simple, like my brother-in-law Phil. But unlike
Phil, this plan just might work.

On Mon, Apr 20, 2020 at 11:39:51AM +0100, nop head wrote: > I created a PR that fixed the degenerate triangles. OpenSCAD > already removes the single point ones but I added removing the needles and > darts with the edge flipping. Problem is the snapping also creates self > intersection just as often I don't know an easy way of fixing those. I've been thinking about it a bit between hitting send on the below email and now... You'd have to find the vector representation of the intersection line between the two planes of the two triangles. Then, for the each three edges of one of the triangles again find the alpha like below, and if you find any alpha 0<alpha<1, then the intersection between the planes happens inside the triangle: the intersection line crosses one edge (it'll intersect with precisely two edges). Now you've FOUND the self-intersection.... I haven't figured out yet what to do next.... This "check for self-intersection" however is much more expensive than the degenerate triangles check: The natural way to do it will be quadratic: check every triangle against every other. A heuristic would be to create "bins" for voxels and then put each triangle in those bins that it could touch. If your voxels are fine enough so that you don't get too many triangles in each voxel, that would significantly reduce the number of checks when there are lots and lots of triangles. (similarly you don't want the voxels too small: Then you get lots of triangles that touch many voxels.) Roger. > On Mon, 20 Apr 2020 at 11:36, Rogier Wolff <R.E.Wolff@bitwizard.nl> wrote: > > Otherwise they are on a single line. > > call the points p1, p2, p3. > > > > Find alpha such that p3 = p1 + alpha (p2-p1); > > If 0 < alpha < 1, p3 is the middle point. > > If alpha < 0, p1 is the middle point. > > If alpha > 1, p2 is the middle point . -- ** R.E.Wolff@BitWizard.nl ** https://www.BitWizard.nl/ ** +31-15-2049110 ** ** Delftechpark 11 2628 XJ Delft, The Netherlands. KVK: 27239233 ** The plan was simple, like my brother-in-law Phil. But unlike Phil, this plan just might work.