DS
Dan Shriver
Wed, Dec 7, 2016 11:26 PM
I'm having fun with OpenSCAD but keep hitting annoying snags here and there.
I'm going to give a sample program and say what my complaints are with it:
- it is hideously slow. Maybe if I could take the points I generate
and draw the triangles between successive ones (and avoid linear extrude
altogether) it would be a lot faster. I have trouble doing that
elegantly. Wolf showed me an interesting method of doing so in another
program but I have a hard time adapting it on my own. When this program ir
run on more than a few "generations" you will notice it takes a very long
time and can crash. I found 4-5 generations took about 12 hours of
processing time
2) I get gaps showing up for higher generations. I'm wondering if this
is some floating point problem. The program is supposed to generate a
shape that is kind of like an odd ribbon but for later generations the
ribbon seems to split and gaps are introduced. I am thinking that my
computation where to put the next layer is somehow slightly off from what
the linear extrudes actually do
function xPlus(baseRadius, generations, multiplier, degree, counter=0,
value=0) = (counter < generations) ? xPlus( baseRadius, generations,
multiplier, degree, (counter +1), (value + (baseRadius*(1/(pow(2,counter)))
- cos(pow(2,counter) * degree)))) : value + (multiplier *
(baseRadius*(1/(pow(2,counter))) * cos(pow(2,counter) * degree)));
function yPlus(baseRadius, generations, multiplier, degree, counter=0,
value=0) = (counter < generations) ? yPlus( baseRadius, generations,
multiplier, degree, (counter +1), (value + (baseRadius*(1/(pow(2,counter)))
- sin(pow(2,counter) * degree)))) : value + (multiplier *
(baseRadius*(1/(pow(2,counter))) * sin(pow(2,counter) * degree)));
function radiusSum(startGen,endGen,baseRadius, sum=0) = (startGen < endGen)
? radiusSum( (startGen + 1), endGen, baseRadius, ( sum +
(baseRadius/(pow(2,startGen))))) : sum;
module
morphBetween(endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,angleStep
= 4) {
//the finalRadius should be 1/2^(endGen)baseRadius
finalRadius= 1/(pow(2,endGen)) * baseRadius;
steps = finalRadius / stepSize;
for (j = [0:steps]) {
multiplier = j/steps;
points = [ for (i= [0:angleStep:359]) [ xPlus(baseRadius, endGen,
multiplier, i), yPlus(baseRadius, endGen, multiplier, i)]];
translate([0,0,(jextrudeSize)]) {
linear_extrude(height=extrudeSize,center=false) {
// calculate 2D outline
difference() {
offset(thickness) polygon(points);
polygon(points);
}
}
}
}
}
module
morphBetweenMore(startGen,endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,angleStep=4)
{
for (i = [startGen:endGen]) {
sum = radiusSum(startGen,i,baseRadius);
echo("sum ",sum," startGen ",startGen," i ",i);
steps = sum / stepSize;
translateFactor = steps * extrudeSize;
translate([0,0,translateFactor]) {
morphBetween(i,baseRadius,stepSize,extrudeSize,thickness,angleStep);
}
}
}
morphBetweenMore(3,4,32,0.1,0.1,1);
I'm having fun with OpenSCAD but keep hitting annoying snags here and there.
I'm going to give a sample program and say what my complaints are with it:
1) it is hideously slow. Maybe if I could take the points I generate
and draw the triangles between successive ones (and avoid linear extrude
altogether) it would be a lot faster. I have trouble doing that
elegantly. Wolf showed me an interesting method of doing so in another
program but I have a hard time adapting it on my own. When this program ir
run on more than a few "generations" you will notice it takes a very long
time and can crash. I found 4-5 generations took about 12 hours of
processing time
2) I get gaps showing up for higher generations. I'm wondering if this
is some floating point problem. The program is supposed to generate a
shape that is kind of like an odd ribbon but for later generations the
ribbon seems to split and gaps are introduced. I am thinking that my
computation where to put the next layer is somehow slightly off from what
the linear extrudes actually do
--------------------------------------------------------------------------------------------------------------------
function xPlus(baseRadius, generations, multiplier, degree, counter=0,
value=0) = (counter < generations) ? xPlus( baseRadius, generations,
multiplier, degree, (counter +1), (value + (baseRadius*(1/(pow(2,counter)))
* cos(pow(2,counter) * degree)))) : value + (multiplier *
(baseRadius*(1/(pow(2,counter))) * cos(pow(2,counter) * degree)));
function yPlus(baseRadius, generations, multiplier, degree, counter=0,
value=0) = (counter < generations) ? yPlus( baseRadius, generations,
multiplier, degree, (counter +1), (value + (baseRadius*(1/(pow(2,counter)))
* sin(pow(2,counter) * degree)))) : value + (multiplier *
(baseRadius*(1/(pow(2,counter))) * sin(pow(2,counter) * degree)));
function radiusSum(startGen,endGen,baseRadius, sum=0) = (startGen < endGen)
? radiusSum( (startGen + 1), endGen, baseRadius, ( sum +
(baseRadius/(pow(2,startGen))))) : sum;
module
morphBetween(endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,angleStep
= 4) {
//the finalRadius should be 1/2^(endGen)*baseRadius
finalRadius= 1/(pow(2,endGen)) * baseRadius;
steps = finalRadius / stepSize;
for (j = [0:steps]) {
multiplier = j/steps;
points = [ for (i= [0:angleStep:359]) [ xPlus(baseRadius, endGen,
multiplier, i), yPlus(baseRadius, endGen, multiplier, i)]];
translate([0,0,(j*extrudeSize)]) {
linear_extrude(height=extrudeSize,center=false) {
// calculate 2D outline
difference() {
offset(thickness) polygon(points);
polygon(points);
}
}
}
}
}
module
morphBetweenMore(startGen,endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,angleStep=4)
{
for (i = [startGen:endGen]) {
sum = radiusSum(startGen,i,baseRadius);
echo("sum ",sum," startGen ",startGen," i ",i);
steps = sum / stepSize;
translateFactor = steps * extrudeSize;
translate([0,0,translateFactor]) {
morphBetween(i,baseRadius,stepSize,extrudeSize,thickness,angleStep);
}
}
}
morphBetweenMore(3,4,32,0.1,0.1,1);
O
otto
Thu, Dec 8, 2016 3:27 AM
A very interesting program.
- Analysis shows ~2/3 of program time is in extrude. ~1/3 is in
offset.
To test I replaced the offset with a dummy inside circle.
The program scales linearly with all the settings I tested.
- I do not think that the difference function is doing what you think
it is.
Calculate the lines:
difference()
{
offset(thickness) polygon(points);
polygon(points);
}
for exactly one level of your extruded stack in 2D, that is do not
extrude the level, examine it as 2D only. Render, do not preview.
The two polygons plotted individually appear to be fairly solid, but
when the difference is plotted contain many small interior spaces.
Extrude spends lots of time plotting these spaces that are never seen.
In the outline of a 2D object that is plotted as a polygon that contains
many interior loops, the interior loops contained in other interior
loops are abandoned in order to make sense of the object, but when the
difference between two similar and complex polygons are plotted the
interior loops become visible and part of the 2D object and will be
used in the extrude.
One should never generate a polygon that has interior loops and expect
Openscad to be able to make sense of it. (Or offset or extrude.)
Interior loops should be generated as a difference or some other basic
operation that are more precisely defined. This will get you into less
trouble. Do not depend upon Openscad to fix mistakes.
Plot a single layer as above and you will see what I mean.
Regards
Otto
On Wed, 7 Dec 2016 18:26:42 -0500
Dan Shriver tabbydan@gmail.com wrote:
I'm having fun with OpenSCAD but keep hitting annoying snags here and
there.
I'm going to give a sample program and say what my complaints are
with it: 1) it is hideously slow. Maybe if I could take the points I
generate and draw the triangles between successive ones (and avoid
linear extrude altogether) it would be a lot faster. I have trouble
doing that elegantly. Wolf showed me an interesting method of doing
so in another program but I have a hard time adapting it on my own.
When this program ir run on more than a few "generations" you will
notice it takes a very long time and can crash. I found 4-5
generations took about 12 hours of processing time
2) I get gaps showing up for higher generations. I'm wondering
if this is some floating point problem. The program is supposed to
generate a shape that is kind of like an odd ribbon but for later
generations the ribbon seems to split and gaps are introduced. I am
thinking that my computation where to put the next layer is somehow
slightly off from what the linear extrudes actually do
function xPlus(baseRadius, generations, multiplier, degree, counter=0,
value=0) = (counter < generations) ? xPlus( baseRadius, generations,
multiplier, degree, (counter +1), (value +
(baseRadius*(1/(pow(2,counter)))
- cos(pow(2,counter) * degree)))) : value + (multiplier *
(baseRadius*(1/(pow(2,counter))) * cos(pow(2,counter) * degree)));
function yPlus(baseRadius, generations, multiplier, degree, counter=0,
value=0) = (counter < generations) ? yPlus( baseRadius, generations,
multiplier, degree, (counter +1), (value +
(baseRadius*(1/(pow(2,counter)))
- sin(pow(2,counter) * degree)))) : value + (multiplier *
(baseRadius*(1/(pow(2,counter))) * sin(pow(2,counter) * degree)));
function radiusSum(startGen,endGen,baseRadius, sum=0) = (startGen <
endGen) ? radiusSum( (startGen + 1), endGen, baseRadius, ( sum +
(baseRadius/(pow(2,startGen))))) : sum;
module
morphBetween(endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,angleStep
= 4) {
//the finalRadius should be 1/2^(endGen)baseRadius
finalRadius= 1/(pow(2,endGen)) * baseRadius;
steps = finalRadius / stepSize;
for (j = [0:steps]) {
multiplier = j/steps;
points = [ for (i= [0:angleStep:359]) [ xPlus(baseRadius,
endGen, multiplier, i), yPlus(baseRadius, endGen, multiplier, i)]];
translate([0,0,(jextrudeSize)]) {
linear_extrude(height=extrudeSize,center=false) {
// calculate 2D outline
difference() {
offset(thickness) polygon(points);
polygon(points);
}
}
}
}
}
module
morphBetweenMore(startGen,endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,angleStep=4)
{
for (i = [startGen:endGen]) {
sum = radiusSum(startGen,i,baseRadius);
echo("sum ",sum," startGen ",startGen," i ",i);
steps = sum / stepSize;
translateFactor = steps * extrudeSize;
translate([0,0,translateFactor]) {
morphBetween(i,baseRadius,stepSize,extrudeSize,thickness,angleStep);
}
}
}
morphBetweenMore(3,4,32,0.1,0.1,1);
A very interesting program.
1. Analysis shows ~2/3 of program time is in extrude. ~1/3 is in
offset.
To test I replaced the offset with a dummy inside circle.
The program scales linearly with all the settings I tested.
2. I do not think that the difference function is doing what you think
it is.
Calculate the lines:
difference()
{
offset(thickness) polygon(points);
polygon(points);
}
for exactly one level of your extruded stack in 2D, that is do not
extrude the level, examine it as 2D only. Render, do not preview.
The two polygons plotted individually appear to be fairly solid, but
when the difference is plotted contain many small interior spaces.
Extrude spends lots of time plotting these spaces that are never seen.
In the outline of a 2D object that is plotted as a polygon that contains
many interior loops, the interior loops contained in other interior
loops are abandoned in order to make sense of the object, but when the
difference between two similar and complex polygons are plotted the
interior loops become visible and part of the 2D object and will be
used in the extrude.
One should never generate a polygon that has interior loops and expect
Openscad to be able to make sense of it. (Or offset or extrude.)
Interior loops should be generated as a difference or some other basic
operation that are more precisely defined. This will get you into less
trouble. Do not depend upon Openscad to fix mistakes.
Plot a single layer as above and you will see what I mean.
Regards
Otto
On Wed, 7 Dec 2016 18:26:42 -0500
Dan Shriver <tabbydan@gmail.com> wrote:
> I'm having fun with OpenSCAD but keep hitting annoying snags here and
> there.
>
> I'm going to give a sample program and say what my complaints are
> with it: 1) it is hideously slow. Maybe if I could take the points I
> generate and draw the triangles between successive ones (and avoid
> linear extrude altogether) it would be a lot faster. I have trouble
> doing that elegantly. Wolf showed me an interesting method of doing
> so in another program but I have a hard time adapting it on my own.
> When this program ir run on more than a few "generations" you will
> notice it takes a very long time and can crash. I found 4-5
> generations took about 12 hours of processing time
> 2) I get gaps showing up for higher generations. I'm wondering
> if this is some floating point problem. The program is supposed to
> generate a shape that is kind of like an odd ribbon but for later
> generations the ribbon seems to split and gaps are introduced. I am
> thinking that my computation where to put the next layer is somehow
> slightly off from what the linear extrudes actually do
>
> --------------------------------------------------------------------------------------------------------------------
> function xPlus(baseRadius, generations, multiplier, degree, counter=0,
> value=0) = (counter < generations) ? xPlus( baseRadius, generations,
> multiplier, degree, (counter +1), (value +
> (baseRadius*(1/(pow(2,counter)))
> * cos(pow(2,counter) * degree)))) : value + (multiplier *
> (baseRadius*(1/(pow(2,counter))) * cos(pow(2,counter) * degree)));
>
>
> function yPlus(baseRadius, generations, multiplier, degree, counter=0,
> value=0) = (counter < generations) ? yPlus( baseRadius, generations,
> multiplier, degree, (counter +1), (value +
> (baseRadius*(1/(pow(2,counter)))
> * sin(pow(2,counter) * degree)))) : value + (multiplier *
> (baseRadius*(1/(pow(2,counter))) * sin(pow(2,counter) * degree)));
>
>
> function radiusSum(startGen,endGen,baseRadius, sum=0) = (startGen <
> endGen) ? radiusSum( (startGen + 1), endGen, baseRadius, ( sum +
> (baseRadius/(pow(2,startGen))))) : sum;
>
>
> module
> morphBetween(endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,angleStep
> = 4) {
> //the finalRadius should be 1/2^(endGen)*baseRadius
> finalRadius= 1/(pow(2,endGen)) * baseRadius;
> steps = finalRadius / stepSize;
> for (j = [0:steps]) {
> multiplier = j/steps;
> points = [ for (i= [0:angleStep:359]) [ xPlus(baseRadius,
> endGen, multiplier, i), yPlus(baseRadius, endGen, multiplier, i)]];
> translate([0,0,(j*extrudeSize)]) {
> linear_extrude(height=extrudeSize,center=false) {
> // calculate 2D outline
> difference() {
> offset(thickness) polygon(points);
> polygon(points);
> }
> }
> }
> }
> }
>
>
> module
> morphBetweenMore(startGen,endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,angleStep=4)
> {
> for (i = [startGen:endGen]) {
> sum = radiusSum(startGen,i,baseRadius);
> echo("sum ",sum," startGen ",startGen," i ",i);
> steps = sum / stepSize;
> translateFactor = steps * extrudeSize;
> translate([0,0,translateFactor]) {
> morphBetween(i,baseRadius,stepSize,extrudeSize,thickness,angleStep);
> }
> }
> }
>
> morphBetweenMore(3,4,32,0.1,0.1,1);
MK
Marius Kintel
Thu, Dec 8, 2016 3:41 AM
..to further clarify:
When rendering (F6), it’s the union of all slabs that takes time.
That said, if you could build the entire shape in code, it would never need to union and thus take less time.
You could use the skin() demo function to do this: https://github.com/openscad/list-comprehension-demos#extrusionscad
..but unfortunately we don’t yet have a polygon offset function which operates on user-space (list) polygon definitions.
-Marius
..to further clarify:
When rendering (F6), it’s the _union_ of all slabs that takes time.
That said, if you could build the entire shape in code, it would never need to union and thus take less time.
You could use the skin() demo function to do this: https://github.com/openscad/list-comprehension-demos#extrusionscad
..but unfortunately we don’t yet have a polygon offset function which operates on user-space (list) polygon definitions.
-Marius
NH
nop head
Thu, Dec 8, 2016 8:59 AM
but unfortunately we don’t yet have a polygon offset function which
operates on user-space (list) polygon definitions.
The routine I wrote for droftarts almost is that. It puts circles at all
the vertices and calculates the tangents that join them. It then plots the
polygon of tangents and adds and subtracts circles at the corners. If it
added the circles as points in the polygon list it would be a 2D offset. It
probably blows up if the vertices are closer than the offset radius though.
On 8 December 2016 at 03:41, Marius Kintel marius@kintel.net wrote:
>but unfortunately we don’t yet have a polygon offset function which
operates on user-space (list) polygon definitions.
The routine I wrote for droftarts almost is that. It puts circles at all
the vertices and calculates the tangents that join them. It then plots the
polygon of tangents and adds and subtracts circles at the corners. If it
added the circles as points in the polygon list it would be a 2D offset. It
probably blows up if the vertices are closer than the offset radius though.
On 8 December 2016 at 03:41, Marius Kintel <marius@kintel.net> wrote:
> ..to further clarify:
>
> When rendering (F6), it’s the _union_ of all slabs that takes time.
> That said, if you could build the entire shape in code, it would never
> need to union and thus take less time.
>
> You could use the skin() demo function to do this:
> https://github.com/openscad/list-comprehension-demos#extrusionscad
> ..but unfortunately we don’t yet have a polygon offset function which
> operates on user-space (list) polygon definitions.
>
> -Marius
>
>
> _______________________________________________
> OpenSCAD mailing list
> Discuss@lists.openscad.org
> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
>
DS
Dan Shriver
Thu, Dec 8, 2016 1:33 PM
I'm not sure I know which loops you are referring to. Some are very
deliberate and I don't understand your suggestion on how to fix. For loops
are entirely inside the wall thickness and not visible, sure I should prune
those, again I'm a little lost on the approach to use.
On Dec 7, 2016 10:28 PM, "otto" otto@123phase.com wrote:
A very interesting program.
- Analysis shows ~2/3 of program time is in extrude. ~1/3 is in
offset.
To test I replaced the offset with a dummy inside circle.
The program scales linearly with all the settings I tested.
- I do not think that the difference function is doing what you think
it is.
Calculate the lines:
difference()
{
offset(thickness) polygon(points);
polygon(points);
}
for exactly one level of your extruded stack in 2D, that is do not
extrude the level, examine it as 2D only. Render, do not preview.
The two polygons plotted individually appear to be fairly solid, but
when the difference is plotted contain many small interior spaces.
Extrude spends lots of time plotting these spaces that are never seen.
In the outline of a 2D object that is plotted as a polygon that contains
many interior loops, the interior loops contained in other interior
loops are abandoned in order to make sense of the object, but when the
difference between two similar and complex polygons are plotted the
interior loops become visible and part of the 2D object and will be
used in the extrude.
One should never generate a polygon that has interior loops and expect
Openscad to be able to make sense of it. (Or offset or extrude.)
Interior loops should be generated as a difference or some other basic
operation that are more precisely defined. This will get you into less
trouble. Do not depend upon Openscad to fix mistakes.
Plot a single layer as above and you will see what I mean.
Regards
Otto
On Wed, 7 Dec 2016 18:26:42 -0500
Dan Shriver tabbydan@gmail.com wrote:
I'm having fun with OpenSCAD but keep hitting annoying snags here and
there.
I'm going to give a sample program and say what my complaints are
with it: 1) it is hideously slow. Maybe if I could take the points I
generate and draw the triangles between successive ones (and avoid
linear extrude altogether) it would be a lot faster. I have trouble
doing that elegantly. Wolf showed me an interesting method of doing
so in another program but I have a hard time adapting it on my own.
When this program ir run on more than a few "generations" you will
notice it takes a very long time and can crash. I found 4-5
generations took about 12 hours of processing time
2) I get gaps showing up for higher generations. I'm wondering
if this is some floating point problem. The program is supposed to
generate a shape that is kind of like an odd ribbon but for later
generations the ribbon seems to split and gaps are introduced. I am
thinking that my computation where to put the next layer is somehow
slightly off from what the linear extrudes actually do
function xPlus(baseRadius, generations, multiplier, degree, counter=0,
value=0) = (counter < generations) ? xPlus( baseRadius, generations,
multiplier, degree, (counter +1), (value +
(baseRadius*(1/(pow(2,counter)))
- cos(pow(2,counter) * degree)))) : value + (multiplier *
(baseRadius*(1/(pow(2,counter))) * cos(pow(2,counter) * degree)));
function yPlus(baseRadius, generations, multiplier, degree, counter=0,
value=0) = (counter < generations) ? yPlus( baseRadius, generations,
multiplier, degree, (counter +1), (value +
(baseRadius*(1/(pow(2,counter)))
- sin(pow(2,counter) * degree)))) : value + (multiplier *
(baseRadius*(1/(pow(2,counter))) * sin(pow(2,counter) * degree)));
function radiusSum(startGen,endGen,baseRadius, sum=0) = (startGen <
endGen) ? radiusSum( (startGen + 1), endGen, baseRadius, ( sum +
(baseRadius/(pow(2,startGen))))) : sum;
module
morphBetween(endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,
= 4) {
//the finalRadius should be 1/2^(endGen)baseRadius
finalRadius= 1/(pow(2,endGen)) * baseRadius;
steps = finalRadius / stepSize;
for (j = [0:steps]) {
multiplier = j/steps;
points = [ for (i= [0:angleStep:359]) [ xPlus(baseRadius,
endGen, multiplier, i), yPlus(baseRadius, endGen, multiplier, i)]];
translate([0,0,(jextrudeSize)]) {
linear_extrude(height=extrudeSize,center=false) {
// calculate 2D outline
difference() {
offset(thickness) polygon(points);
polygon(points);
}
}
}
}
}
module
morphBetweenMore(startGen,endGen,baseRadius,stepSize,
extrudeSize,thickness=0.4,angleStep=4)
{
for (i = [startGen:endGen]) {
sum = radiusSum(startGen,i,baseRadius);
echo("sum ",sum," startGen ",startGen," i ",i);
steps = sum / stepSize;
translateFactor = steps * extrudeSize;
translate([0,0,translateFactor]) {
morphBetween(i,baseRadius,stepSize,extrudeSize,
}
}
}
morphBetweenMore(3,4,32,0.1,0.1,1);
I'm not sure I know which loops you are referring to. Some are very
deliberate and I don't understand your suggestion on how to fix. For loops
are entirely inside the wall thickness and not visible, sure I should prune
those, again I'm a little lost on the approach to use.
On Dec 7, 2016 10:28 PM, "otto" <otto@123phase.com> wrote:
> A very interesting program.
>
> 1. Analysis shows ~2/3 of program time is in extrude. ~1/3 is in
> offset.
>
> To test I replaced the offset with a dummy inside circle.
>
> The program scales linearly with all the settings I tested.
>
> 2. I do not think that the difference function is doing what you think
> it is.
>
> Calculate the lines:
>
> difference()
> {
> offset(thickness) polygon(points);
> polygon(points);
> }
>
> for exactly one level of your extruded stack in 2D, that is do not
> extrude the level, examine it as 2D only. Render, do not preview.
>
> The two polygons plotted individually appear to be fairly solid, but
> when the difference is plotted contain many small interior spaces.
> Extrude spends lots of time plotting these spaces that are never seen.
> In the outline of a 2D object that is plotted as a polygon that contains
> many interior loops, the interior loops contained in other interior
> loops are abandoned in order to make sense of the object, but when the
> difference between two similar and complex polygons are plotted the
> interior loops become visible and part of the 2D object and will be
> used in the extrude.
>
> One should never generate a polygon that has interior loops and expect
> Openscad to be able to make sense of it. (Or offset or extrude.)
> Interior loops should be generated as a difference or some other basic
> operation that are more precisely defined. This will get you into less
> trouble. Do not depend upon Openscad to fix mistakes.
>
> Plot a single layer as above and you will see what I mean.
>
> Regards
> Otto
>
>
> On Wed, 7 Dec 2016 18:26:42 -0500
> Dan Shriver <tabbydan@gmail.com> wrote:
>
> > I'm having fun with OpenSCAD but keep hitting annoying snags here and
> > there.
> >
> > I'm going to give a sample program and say what my complaints are
> > with it: 1) it is hideously slow. Maybe if I could take the points I
> > generate and draw the triangles between successive ones (and avoid
> > linear extrude altogether) it would be a lot faster. I have trouble
> > doing that elegantly. Wolf showed me an interesting method of doing
> > so in another program but I have a hard time adapting it on my own.
> > When this program ir run on more than a few "generations" you will
> > notice it takes a very long time and can crash. I found 4-5
> > generations took about 12 hours of processing time
> > 2) I get gaps showing up for higher generations. I'm wondering
> > if this is some floating point problem. The program is supposed to
> > generate a shape that is kind of like an odd ribbon but for later
> > generations the ribbon seems to split and gaps are introduced. I am
> > thinking that my computation where to put the next layer is somehow
> > slightly off from what the linear extrudes actually do
> >
> > ------------------------------------------------------------
> --------------------------------------------------------
> > function xPlus(baseRadius, generations, multiplier, degree, counter=0,
> > value=0) = (counter < generations) ? xPlus( baseRadius, generations,
> > multiplier, degree, (counter +1), (value +
> > (baseRadius*(1/(pow(2,counter)))
> > * cos(pow(2,counter) * degree)))) : value + (multiplier *
> > (baseRadius*(1/(pow(2,counter))) * cos(pow(2,counter) * degree)));
> >
> >
> > function yPlus(baseRadius, generations, multiplier, degree, counter=0,
> > value=0) = (counter < generations) ? yPlus( baseRadius, generations,
> > multiplier, degree, (counter +1), (value +
> > (baseRadius*(1/(pow(2,counter)))
> > * sin(pow(2,counter) * degree)))) : value + (multiplier *
> > (baseRadius*(1/(pow(2,counter))) * sin(pow(2,counter) * degree)));
> >
> >
> > function radiusSum(startGen,endGen,baseRadius, sum=0) = (startGen <
> > endGen) ? radiusSum( (startGen + 1), endGen, baseRadius, ( sum +
> > (baseRadius/(pow(2,startGen))))) : sum;
> >
> >
> > module
> > morphBetween(endGen,baseRadius,stepSize,extrudeSize,thickness=0.4,
> angleStep
> > = 4) {
> > //the finalRadius should be 1/2^(endGen)*baseRadius
> > finalRadius= 1/(pow(2,endGen)) * baseRadius;
> > steps = finalRadius / stepSize;
> > for (j = [0:steps]) {
> > multiplier = j/steps;
> > points = [ for (i= [0:angleStep:359]) [ xPlus(baseRadius,
> > endGen, multiplier, i), yPlus(baseRadius, endGen, multiplier, i)]];
> > translate([0,0,(j*extrudeSize)]) {
> > linear_extrude(height=extrudeSize,center=false) {
> > // calculate 2D outline
> > difference() {
> > offset(thickness) polygon(points);
> > polygon(points);
> > }
> > }
> > }
> > }
> > }
> >
> >
> > module
> > morphBetweenMore(startGen,endGen,baseRadius,stepSize,
> extrudeSize,thickness=0.4,angleStep=4)
> > {
> > for (i = [startGen:endGen]) {
> > sum = radiusSum(startGen,i,baseRadius);
> > echo("sum ",sum," startGen ",startGen," i ",i);
> > steps = sum / stepSize;
> > translateFactor = steps * extrudeSize;
> > translate([0,0,translateFactor]) {
> > morphBetween(i,baseRadius,stepSize,extrudeSize,
> thickness,angleStep);
> > }
> > }
> > }
> >
> > morphBetweenMore(3,4,32,0.1,0.1,1);
>
>
> _______________________________________________
> OpenSCAD mailing list
> Discuss@lists.openscad.org
> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
>
P
Parkinbot
Thu, Dec 8, 2016 7:06 PM
It is always nice to post an image of an object. So here is one. Looking at
it shows that there are furcations within the extrusion. They seem to result
from polygon loops emerging in dependence of the extrusion height.
Topologically the result is a chameleon. To do it properly (and smoother)
you'd need an approach like the one presented by Ronaldo within this thread
http://forum.openscad.org/Can-you-sweep-a-object-with-fingers-tp19057.html
In your case is it easier to use the skin() or sweep() approach, which is
also very fast, if used properly. Since this approach works only with simple
(non self-intersecting) polygons, you have to cut your design into piecewise
extrusions, which you describe by simple polygons only, and apply a final
union on those pieces.
In the given example this means, you have to cut your (symmetric) design
into two halves along the xz-plane and each half again to "open" all the
loops. With this preparation you will be able to extrude your design chunks
rapidly (also with F6), using one of the skin() or the sweep() examples that
have been discussed in other threads and exemplified in
http://www.thingiverse.com/thing:900137.
I'm afraid that you will have to write your own polygon offset function for
that, but you can find code for this, as it has been presented in an other
thread
http://forum.openscad.org/Polygon-Offset-Function-tp17186p17256.html .
http://forum.openscad.org/file/n19511/Unbenannt.png
--
View this message in context: http://forum.openscad.org/An-alternative-to-linear-extrude-tp19503p19511.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
It is always nice to post an image of an object. So here is one. Looking at
it shows that there are furcations within the extrusion. They seem to result
from polygon loops emerging in dependence of the extrusion height.
Topologically the result is a chameleon. To do it properly (and smoother)
you'd need an approach like the one presented by Ronaldo within this thread
<http://forum.openscad.org/Can-you-sweep-a-object-with-fingers-tp19057.html>
In your case is it easier to use the skin() or sweep() approach, which is
also very fast, if used properly. Since this approach works only with simple
(non self-intersecting) polygons, you have to cut your design into piecewise
extrusions, which you describe by simple polygons only, and apply a final
union on those pieces.
In the given example this means, you have to cut your (symmetric) design
into two halves along the xz-plane and each half again to "open" all the
loops. With this preparation you will be able to extrude your design chunks
rapidly (also with F6), using one of the skin() or the sweep() examples that
have been discussed in other threads and exemplified in
http://www.thingiverse.com/thing:900137.
I'm afraid that you will have to write your own polygon offset function for
that, but you can find code for this, as it has been presented in an other
thread
<http://forum.openscad.org/Polygon-Offset-Function-tp17186p17256.html> .
<http://forum.openscad.org/file/n19511/Unbenannt.png>
--
View this message in context: http://forum.openscad.org/An-alternative-to-linear-extrude-tp19503p19511.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
W
wolf
Fri, Dec 9, 2016 2:41 AM
Let me enlarge here on what ottojas has said with regard to the validity of
OpenSCAD geometry. The first thing for a newbie to OpenSCAD understand that
OpenSCAD supports the right-hand rule for assigning positive / negative
coordinates. This means that all face normals for valid geometry face
outside, and OpenSCAD colors these faces yellow, unless you as the user
chose to override this. If the face normal points inside, activating
View->Thrown Together will paint purple all faces having its normal pointing
inside. More experienced users of OpenSCAD call these faces inside-out
faces. If you magnify DanS's shape enough, you'll see that it is full of
inside-out faces, and that they are small enough not to be visible when
viewing his full shape.
CGAL will usually run into difficulties when it encounters inside-out faces,
so using some boolean operation can also serve as a test that the geometry
is well-formed. Doing a difference() on DanS's code
difference()
{morphBetweenMore(3,4,32,0.1,0.1,1);
cube([100,100,100]);}
results in CGAL issuing a WARNING: Object may not be a valid 2-manifold and
need repair!
DanS's problem, I think can be said with certainty now, arises from the
presence of self-intersections, and that OpenSCAD not only does not
eliminate them automatically, but expects the user to do that explicitly
him/herself. To an experienced user that would be obvious, to a newbie it
probably is not.
There are three ways I am aware of to note down 3D geometry. In stl files,
each triangular face is reported by 4 vectors, i.e. the face normal and the
three points giving the corners of the triangle. This approach makes the
file rather bulky, but there are no requirements to order the list of
triangles in any way.
For its polyhedron() approach, OpenSCAD is more parsimonious on how to
describe a 3D shape. Here, each point is listed only once in the points
list. This list is then followed by a faces list, which may be taken as an
index into the points list stating which point is part of each face. This
list is partly ordered: the sequence of each face in the list does not
matter, but the sequence of the points inside a face does. From this latter
sequence, the face normal may be calculated, and thus this sequence
determines whether a face points inside-out or not.
With a fully-ordered list of points, the faces list may be calculated and
thus need not be provided by the user. This approach is fast, because, to
quote Kintel "you could build the entire shape in code, it would never need
to union and thus take less time".
OpenSCAD does not provide this approach natively, but it can be used inside
OpenSCAD by calculating the faces list from a appropriately ordered points
list and then inserting both points and faces into a polyhedron(0
instruction.
I have done this, as DanS pointed out above, and obtained this shape after
11 seconds F5 or 12 seconds F6.
http://forum.openscad.org/file/n19513/Dan4.jpg
Shown here is the full shape, with thrown Together activated. As you see,
there are many faces that are inside out. Looking at a detail with Show
Edges also activated,
http://forum.openscad.org/file/n19513/Dan4-Detail.jpg
you can clearly see that inside-out faces intersect properly oriented faces
and thus the issue that has not been addressed when creating this geometry
is self-intersecting faces.
If we cut the shape open, we see the self-intersections in even more
clearly:
http://forum.openscad.org/file/n19513/Dan4-Slice200.jpg
wolf
--
View this message in context: http://forum.openscad.org/An-alternative-to-linear-extrude-tp19503p19513.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
Let me enlarge here on what ottojas has said with regard to the validity of
OpenSCAD geometry. The first thing for a newbie to OpenSCAD understand that
OpenSCAD supports the right-hand rule for assigning positive / negative
coordinates. This means that all face normals for valid geometry face
outside, and OpenSCAD colors these faces yellow, unless you as the user
chose to override this. If the face normal points inside, activating
View->Thrown Together will paint purple all faces having its normal pointing
inside. More experienced users of OpenSCAD call these faces inside-out
faces. If you magnify DanS's shape enough, you'll see that it is full of
inside-out faces, and that they are small enough not to be visible when
viewing his full shape.
CGAL will usually run into difficulties when it encounters inside-out faces,
so using some boolean operation can also serve as a test that the geometry
is well-formed. Doing a difference() on DanS's code
difference()
{morphBetweenMore(3,4,32,0.1,0.1,1);
cube([100,100,100]);}
results in CGAL issuing a WARNING: Object may not be a valid 2-manifold and
need repair!
DanS's problem, I think can be said with certainty now, arises from the
presence of self-intersections, and that OpenSCAD not only does not
eliminate them automatically, but expects the user to do that explicitly
him/herself. To an experienced user that would be obvious, to a newbie it
probably is not.
There are three ways I am aware of to note down 3D geometry. In stl files,
each triangular face is reported by 4 vectors, i.e. the face normal and the
three points giving the corners of the triangle. This approach makes the
file rather bulky, but there are no requirements to order the list of
triangles in any way.
For its polyhedron() approach, OpenSCAD is more parsimonious on how to
describe a 3D shape. Here, each point is listed only once in the points
list. This list is then followed by a faces list, which may be taken as an
index into the points list stating which point is part of each face. This
list is partly ordered: the sequence of each face in the list does not
matter, but the sequence of the points inside a face does. From this latter
sequence, the face normal may be calculated, and thus this sequence
determines whether a face points inside-out or not.
With a fully-ordered list of points, the faces list may be calculated and
thus need not be provided by the user. This approach is fast, because, to
quote Kintel "you could build the entire shape in code, it would never need
to union and thus take less time".
OpenSCAD does not provide this approach natively, but it can be used inside
OpenSCAD by calculating the faces list from a appropriately ordered points
list and then inserting both points and faces into a polyhedron(0
instruction.
I have done this, as DanS pointed out above, and obtained this shape after
11 seconds F5 or 12 seconds F6.
<http://forum.openscad.org/file/n19513/Dan4.jpg>
Shown here is the full shape, with thrown Together activated. As you see,
there are many faces that are inside out. Looking at a detail with Show
Edges also activated,
<http://forum.openscad.org/file/n19513/Dan4-Detail.jpg>
you can clearly see that inside-out faces intersect properly oriented faces
and thus the issue that has not been addressed when creating this geometry
is self-intersecting faces.
If we cut the shape open, we see the self-intersections in even more
clearly:
<http://forum.openscad.org/file/n19513/Dan4-Slice200.jpg>
wolf
--
View this message in context: http://forum.openscad.org/An-alternative-to-linear-extrude-tp19503p19513.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
A
arnholm@arnholm.org
Fri, Dec 9, 2016 7:30 AM
On 2016-12-09 03:41, wolf wrote:
It is theoretically and practically possible to automatically identify
and correct such inside out faces, on the condition that they occur in
2-manifold polyhedrons.
you can clearly see that inside-out faces intersect properly oriented
faces
and thus the issue that has not been addressed when creating this
geometry
is self-intersecting faces.
With self-intersection present, the conditions for automatic correction
of inside out faces is not met, because 'inside' and 'outside' becomes
ill defined. At least that is how I understand it.
Carsten Arnholm
On 2016-12-09 03:41, wolf wrote:
> <http://forum.openscad.org/file/n19513/Dan4.jpg>
> Shown here is the full shape, with thrown Together activated. As you
> see,
> there are many faces that are inside out. Looking at a detail with Show
> Edges also activated,
> <http://forum.openscad.org/file/n19513/Dan4-Detail.jpg>
It is theoretically and practically possible to automatically identify
and correct such inside out faces, on the condition that they occur in
2-manifold polyhedrons.
> you can clearly see that inside-out faces intersect properly oriented
> faces
> and thus the issue that has not been addressed when creating this
> geometry
> is self-intersecting faces.
With self-intersection present, the conditions for automatic correction
of inside out faces is not met, because 'inside' and 'outside' becomes
ill defined. At least that is how I understand it.
Carsten Arnholm
W
wolf
Fri, Dec 9, 2016 7:59 PM
It is theoretically and practically possible to automatically identify
and correct such inside out faces, on the condition that they occur in
2-manifold polyhedrons.
With this statement, I disagree. Take this little cube:
Points=[[0.00000000,0.00000000,0.00000000],
[10.00000000,0.00000000,0.00000000],
[0.00000000,10.00000000,0.00000000],
[10.00000000,10.00000000,0.00000000],
[0.00000000,0.00000000,10.00000000],
[10.00000000,0.00000000,10.00000000],
[0.00000000,10.00000000,10.00000000],
[10.00000000,10.00000000,10.00000000]];
Faces=[[6,5,7],
[5,6,4],
[0,3,1],
[3,0,2],
[0,5,4],
[5,0,1],
[5,3,7],
[3,5,1],
[3,6,7],
[6,3,2],
[0,6,2],
[6,0,4]];
polyhedron(Points,Faces);
All its faces are inside-out. By reversing its faces list, by e.g.
changing face [5,6,4] to [4,6,5], we see that face orientation is an
arbitrary decision, as would be to interpret this shape as a cube, or as a
cubical hole in space. That's a human decision. In other words, it is
based on a specific person's preferences, not upon objective fact.
With self-intersection present, the conditions for automatic correction
of inside out faces is not met, because 'inside' and 'outside' becomes
ill defined. At least that is how I understand it.
To have self-intersections means there are locations inside a polyhedron
where lines and points are missing from the points and faces list. After
all, the intersection of two planes in 3D space defines a line, and the
intersection of two lines defines a point.
Missing lines and points does constitute a bug, at least in my view. What
do you think? Should we ask kintel to open an issue?
For newbies like DanS, understanding even the problems he/she has let
him/herself into is hard enough. I would think to have a command like
RemoveSelfIntersections(shape) would be appropriate and useful.
wolf
OpenSCAD mailing list
cacb wrote
> It is theoretically and practically possible to automatically identify
> and correct such inside out faces, on the condition that they occur in
> 2-manifold polyhedrons.
>
> With this statement, I disagree. Take this little cube:
> Points=[[0.00000000,0.00000000,0.00000000],
> [10.00000000,0.00000000,0.00000000],
> [0.00000000,10.00000000,0.00000000],
> [10.00000000,10.00000000,0.00000000],
> [0.00000000,0.00000000,10.00000000],
> [10.00000000,0.00000000,10.00000000],
> [0.00000000,10.00000000,10.00000000],
> [10.00000000,10.00000000,10.00000000]];
> Faces=[[6,5,7],
> [5,6,4],
> [0,3,1],
> [3,0,2],
> [0,5,4],
> [5,0,1],
> [5,3,7],
> [3,5,1],
> [3,6,7],
> [6,3,2],
> [0,6,2],
> [6,0,4]];
> polyhedron(Points,Faces);
> All its faces are inside-out. By reversing its faces list, by e.g.
> changing face [5,6,4] to [4,6,5], we see that face orientation is an
> arbitrary decision, as would be to interpret this shape as a cube, or as a
> cubical hole in space. That's a human decision. In other words, it is
> based on a specific person's preferences, not upon objective fact.
>
>
> With self-intersection present, the conditions for automatic correction
> of inside out faces is not met, because 'inside' and 'outside' becomes
> ill defined. At least that is how I understand it.
>
> To have self-intersections means there are locations inside a polyhedron
> where lines and points are missing from the points and faces list. After
> all, the intersection of two planes in 3D space defines a line, and the
> intersection of two lines defines a point.
> Missing lines and points does constitute a bug, at least in my view. What
> do you think? Should we ask kintel to open an issue?
> For newbies like DanS, understanding even the problems he/she has let
> him/herself into is hard enough. I would think to have a command like
> RemoveSelfIntersections(shape) would be appropriate and useful.
>
> wolf
>
> _______________________________________________
> OpenSCAD mailing list
> Discuss@.openscad
> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
--
View this message in context: http://forum.openscad.org/An-alternative-to-linear-extrude-tp19503p19522.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
CA
Carsten Arnholm
Fri, Dec 9, 2016 9:47 PM
On 09. des. 2016 20:59, wolf wrote:
It is theoretically and practically possible to automatically identify
and correct such inside out faces, on the condition that they occur in
2-manifold polyhedrons.
With this statement, I disagree. Take this little cube:
Nice example, I took your code and created an STL "flipface.stl" in
OpenSCAD. As you say, all the faces are inside out. This can be verified
using F12 "Thrown Together", all sides are shown purple.
I then ran your cube through my healer code, requesting it identify
inside out faces and correct them. Here is the log:
==============================
abm_polyfix flipface.stl -flip
Parameters:
flip =
input_file = flipface.stl
polyhedron 0, dtol=0.01, atol=1e-006, maxiter=10
iteration 0: vertices=36 faces=12
warning: nonmanifold edges: uc(1)=36
merged 28 vertices
total changes=28
no warnings
iteration 1: vertices=8 faces=12
total changes=0
no warnings
Lump analysis:
lumps=1
lump 0 flipped 12 faces
Writing: flipface_polyfix.stl
polyhedron 0: vertices=8 faces=12
... abm_polyfix finished, time used: 0d 00h 00m 00s
As you can see, it determined that all 12 faces were inside out and
flipped them. Importing the modified STL back into OpenSCAD confirms
there are no more purple faces.
All its faces are inside-out. By reversing its faces list, by e.g.
changing face [5,6,4] to [4,6,5], we see that face orientation is an
arbitrary decision, as would be to interpret this shape as a cube, or as a
cubical hole in space. That's a human decision. In other words, it is
based on a specific person's preferences, not upon objective fact.
No. The face orientation is not arbitrary in the context of executing
boolean operations on polyhedron meshes. The basic requirement is that
the polyhedron is 2-manifold, no self-intersections and the face normals
pointing out (="away from the material and into the void"). That is how
one determines where the material is.
In your cube, the normals were pointing into the solid material
(assuming you didn't want a cubic void in an infinite, solid universe!).
Since the cube is 2-manifold (after reconnecting the STL "polygon soup")
and with no self-intersections, it was possible to determine from an
arbitrarily chosen face whether it points in our out. Once that has been
determined one can use it as a reference and compare with neighbor face
winding orders to determine whether they are properly oriented, and flip
the ones that are oriented the wrong way.
In this case, it worked as expected.
To have self-intersections means there are locations inside a polyhedron
where lines and points are missing from the points and faces list.
Not necessarily. It is sufficient that some point coordinates are such
that self-intersections occur. The polyhedron topology may even be a
valid 2-manifold and still have self-intersections.
Missing lines and points does constitute a bug, at least in my view. What
do you think?
This is something completely different than the above.
I think you mean references to non-existing points from the faces in a
polyhedron command. I just checked to see what happens if you have that,
it appeared to silently ignore such references. I would call that a bug,
yes. I think a useful behavior would to stop the interpretation at that
point and give an error message "polyhedron vertex number reference out
of range in line NN" or something to that effect.
For newbies like DanS, understanding even the problems he/she has let
him/herself into is hard enough. I would think to have a command like
RemoveSelfIntersections(shape) would be appropriate and useful.
It sounds good from a user perspective, but I don't think it is possible
to implement. If you split and reconnect such faces at the
intersections, you will end up with N-manifold edges (N>2), violating
the 2-manifold basic requirement so it really is not of any practical
help. It is not possible for the software to guess the user's real
intent, so I think at best such self intersections could be detected and
reported. The user would have to decide what to do to fix it.
Carsten Arnholm
On 09. des. 2016 20:59, wolf wrote:
> cacb wrote
>> It is theoretically and practically possible to automatically identify
>> and correct such inside out faces, on the condition that they occur in
>> 2-manifold polyhedrons.
>>
>> With this statement, I disagree. Take this little cube:
Nice example, I took your code and created an STL "flipface.stl" in
OpenSCAD. As you say, all the faces are inside out. This can be verified
using F12 "Thrown Together", all sides are shown purple.
I then ran your cube through my healer code, requesting it identify
inside out faces and correct them. Here is the log:
==============================
>abm_polyfix flipface.stl -flip
Parameters:
flip =
input_file = flipface.stl
polyhedron 0, dtol=0.01, atol=1e-006, maxiter=10
iteration 0: vertices=36 faces=12
warning: nonmanifold edges: uc(1)=36
merged 28 vertices
total changes=28
no warnings
iteration 1: vertices=8 faces=12
total changes=0
no warnings
Lump analysis:
lumps=1
lump 0 flipped 12 faces
Writing: flipface_polyfix.stl
polyhedron 0: vertices=8 faces=12
... abm_polyfix finished, time used: 0d 00h 00m 00s
==============================
As you can see, it determined that all 12 faces were inside out and
flipped them. Importing the modified STL back into OpenSCAD confirms
there are no more purple faces.
>> All its faces are inside-out. By reversing its faces list, by e.g.
>> changing face [5,6,4] to [4,6,5], we see that face orientation is an
>> arbitrary decision, as would be to interpret this shape as a cube, or as a
>> cubical hole in space. That's a human decision. In other words, it is
>> based on a specific person's preferences, not upon objective fact.
No. The face orientation is not arbitrary in the context of executing
boolean operations on polyhedron meshes. The basic requirement is that
the polyhedron is 2-manifold, no self-intersections and the face normals
pointing out (="away from the material and into the void"). That is how
one determines where the material is.
In your cube, the normals were pointing into the solid material
(assuming you didn't want a cubic void in an infinite, solid universe!).
Since the cube is 2-manifold (after reconnecting the STL "polygon soup")
and with no self-intersections, it was possible to determine from an
arbitrarily chosen face whether it points in our out. Once that has been
determined one can use it as a reference and compare with neighbor face
winding orders to determine whether they are properly oriented, and flip
the ones that are oriented the wrong way.
In this case, it worked as expected.
>> To have self-intersections means there are locations inside a polyhedron
>> where lines and points are missing from the points and faces list.
Not necessarily. It is sufficient that some point coordinates are such
that self-intersections occur. The polyhedron topology may even be a
valid 2-manifold and still have self-intersections.
>> Missing lines and points does constitute a bug, at least in my view. What
>> do you think?
This is something completely different than the above.
I think you mean references to non-existing points from the faces in a
polyhedron command. I just checked to see what happens if you have that,
it appeared to silently ignore such references. I would call that a bug,
yes. I think a useful behavior would to stop the interpretation at that
point and give an error message "polyhedron vertex number reference out
of range in line NN" or something to that effect.
>> For newbies like DanS, understanding even the problems he/she has let
>> him/herself into is hard enough. I would think to have a command like
>> RemoveSelfIntersections(shape) would be appropriate and useful.
It sounds good from a user perspective, but I don't think it is possible
to implement. If you split and reconnect such faces at the
intersections, you will end up with N-manifold edges (N>2), violating
the 2-manifold basic requirement so it really is not of any practical
help. It is not possible for the software to guess the user's real
intent, so I think at best such self intersections could be detected and
reported. The user would have to decide what to do to fix it.
Carsten Arnholm