<?xml version="1.0" ?>
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://www.ribbonsoft.com/bugtracker/">
    <title>Flyspray::</title>
    <link>https://www.ribbonsoft.com/bugtracker/</link>
    <description>Flyspray::QCAD Bugtracker: Recently edited tasks</description>
    <dc:date>2026-08-15T07:53:04Z</dc:date>
    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2741" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2740" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2564" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2739" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2738" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2737" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2734" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2736" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2735" />
                <rdf:li rdf:resource="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2733" />
              </rdf:Seq>
    </items>
    		
  </channel>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2741">
    <title>FS#2741: Comparing values with the squared tolerance (1e-18)</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2741</link>
    <dc:date>2026-08-15T07:53:04Z</dc:date>
    <dc:creator>CVH</dc:creator>
     <description>

Andrew, 



Nicely summarized by an AI:Comparing two floating-point values within a tolerance is NOTthe same as comparing their squared values within the squared tolerance.Squaring changes the scale of values and the distance between them.This breaks the linear logic used in standard tolerance checks, especially for values near zero or larger values.



Why These Methods Are Not Equal:- Different scaling near zero: If a = 0.1 and b = 0.2, their absolute difference is 0.1.Their squared values are 0.01 and 0.04, with a difference of 0.03 (three times smaller).- Different scaling for large values: If a = 1000.1 and b = 1000.2, their difference is 0.1, but their squared values differ by about 200 (2000 times larger).- Tolerance distortion: A linear tolerance epsilon allows a fixed window [a-epsilon &amp;lt; b &amp;lt; a+epsilon]. Squaring maps this to a non-linear, asymmetric range that grows much faster for larger base values.



When It Fails:- Small values (&amp;lt;±1): The squared difference becomes much smaller than the linear difference.A tolerance that passes linear values might fail squared values.- Larger values (&amp;gt;±1): The squared difference becomes much larger than the linear difference.A tolerance that passes linear values will likely fail squared values.- Negative values: Squaring loses the sign. If (a = -1.001) and (b = 1.001), they are far apart linearly,but their squared values are nearly identical (1.002 vs 1.002).





 Recently implemented at various places in QCAD.For example to compare a distance in XY with a value within tolerance avoiding thesqrt() for the vector magnitude.Where the distance d = sqrt(dX²+dY²+dZ²) is compared with a positive value v within a small tolerance (e.g. RS.PointTolerance = 1e-9)Including dZ because there is no 2D variant for RVector::getSquaredMagnitude().Or for example where the squared distance is calulated in direct as dSqr = dX²+dY².



Typically worked out as fabs(d - v) &amp;lt; 1e-9 (analog of RMath.fuzzyCompare).What results in fabs(sqrt(dX²+dY²) - v) &amp;lt; 1e-9.



And then falsely replaced by fabs(dX²+dY² - v²) &amp;lt; 1e-9*1e-9 Or comparing a difference to within 1e-18.In the case of larger numbers (&amp;gt;1):Subtracting 2 much larger but near equal values with no more than 17 significant digits.



Also algebraically incorrect ! … Squaring both sides of (|d - v| &amp;lt; tol) to exploit d² instead of d results in: ((d - v)² &amp;lt; tol²)And this expands to: (d² - 2dv + v² &amp;lt; tol²) where the root d is still present.



(fabs(d - v) &amp;lt; tol) is already a reduction of a window comparison: (d &amp;gt; v-tol &amp;amp;&amp;amp; d &amp;lt; v+tol)At best, avoiding the subtraction of a small value in floating point: (d+tol &amp;gt; v &amp;amp;&amp;amp; d &amp;lt; v+tol)We then also avoid digit cancellation when subtracting larger values in fabs(d - v).But squaring this also leads to ((d+tol)² &amp;gt; v²) or (d²+2*d*tol+tol² &amp;gt; v²) for the first test.  





With the initial window comparison:Squaring (d &amp;gt; v-tol &amp;amp;&amp;amp; d &amp;lt; v+tol) results in: (d² &amp;gt; (v-tol)² &amp;amp;&amp;amp; d² &amp;lt; (v+tol)²)In wich we can replace d² and the intended value v ≈ sqrt(d²) to compare with: (dSqr=dX²+dY² &amp;gt; (v-tol)² &amp;amp;&amp;amp; dSqr=dX²+dY² &amp;lt; (v+tol)²)



This may fail when (d == v).And always when tol is too small to be added or subtracted in floating-point.When comparing (squared) values within a small tolerance we must thus include equality:

if (dSqr &amp;gt;= (v-tol)*(v-tol) &amp;amp;&amp;amp; dSqr &amp;lt;= (v+tol)*(v+tol)) {...}


Programmatically more complex … … and perhaps no longer a faster method than taking the root.The second test is skipped when the first is true.



It certainly avoids the absurd comparison with 1e-18.Because that is mostly true for real near equal distances.



 Regards,CVH

</description>
    <content:encoded><![CDATA[
<p>
Andrew, 
</p>

<p>
Nicely summarized by an AI:<br />Comparing two floating-point values within a tolerance is NOT<br />the same as comparing their squared values within the squared tolerance.<br />Squaring changes the scale of values and the distance between them.<br />This breaks the linear logic used in standard tolerance checks, especially for values near zero or larger values.
</p>

<p>
<strong><em>Why These Methods Are Not Equal</em></strong>:<br />- Different scaling near zero: <br />If a = 0.1 and b = 0.2, their absolute difference is <strong>0.1</strong>.<br />Their squared values are 0.01 and 0.04, with a difference of <strong>0.03</strong> (three times smaller).<br />- Different scaling for large values: <br />If a = 1000.1 and b = 1000.2, their difference is <strong>0.1</strong>, <br />but their squared values differ by about <strong>200</strong> (2000 times larger).<br />- Tolerance distortion: <br />A linear tolerance epsilon allows a fixed window <strong>[a-epsilon &lt; b &lt; a+epsilon]</strong>. Squaring maps this to a non-linear, asymmetric range that grows much faster for larger base values.
</p>

<p>
<strong><em>When It Fails</em></strong>:<br />- Small values (&lt;±1): <br />The squared difference becomes much smaller than the linear difference.<br />A tolerance that passes linear values might fail squared values.<br />- Larger values (&gt;±1): <br />The squared difference becomes much larger than the linear difference.<br />A tolerance that passes linear values will likely fail squared values.<br />- Negative values: Squaring loses the sign. <br />If (a = -1.001) and (b = 1.001), they are far apart linearly,<br />but their squared values are nearly identical (1.002 vs 1.002).
</p>
<hr />
<hr />

<p>
 Recently implemented at various places in QCAD.<br />For example to compare a distance in XY with a value within tolerance avoiding the<br /><strong>sqrt()</strong> for the vector magnitude.<br />Where the distance <strong>d = sqrt(dX²+dY²+dZ²)</strong> is compared with a positive value <strong>v</strong> within a small tolerance (e.g. <em>RS.PointTolerance = 1e-9</em>)<br />Including dZ because there is no 2D variant for <em>RVector::getSquaredMagnitude()</em>.<br />Or for example where the squared distance is calulated in direct as <strong>dSqr = dX²+dY²</strong>.
</p>

<p>
Typically worked out as <strong>fabs(d - v) &lt; 1e-9</strong> (analog of <em>RMath.fuzzyCompare</em>).<br />What results in <strong>fabs(sqrt(dX²+dY²) - v) &lt; 1e-9</strong>.
</p>

<p>
And then falsely replaced by <strong>fabs(dX²+dY² - v²) &lt; 1e-9*1e-9</strong> <br />Or comparing a difference to within <em class="u"><strong>1e-18</strong></em>.<br />In the case of larger numbers (&gt;1):<br />Subtracting 2 much larger but near equal values with no more than 17 significant digits.
</p>

<p>
<strong>Also algebraically incorrect !</strong> … <br />Squaring both sides of (<strong>|d - v| &lt; tol</strong>) to exploit <strong>d²</strong> instead of <strong>d</strong> results in: (<strong>(d - v)² &lt; tol²</strong>)<br />And this expands to: (<strong>d² - 2dv + v² &lt; tol²</strong>) where the root <strong>d</strong> is still present.
</p>

<p>
(<strong>fabs(d - v) &lt; tol</strong>) is already a reduction of a window comparison: (<strong>d &gt; v-tol &amp;&amp; d &lt; v+tol</strong>)<br />At best, avoiding the subtraction of a small value in floating point: (<strong>d+tol &gt; v &amp;&amp; d &lt; v+tol</strong>)<br />We then also avoid digit cancellation when subtracting larger values in <strong>fabs(d - v)</strong>.<br />But squaring this also leads to (<strong>(d+tol)² &gt; v²</strong>) or (<strong>d²+<em class="u">2*d*tol</em>+tol² &gt; v²</strong>) for the first test.  
</p>
<hr />
<hr />

<p>
With the initial window comparison:<br />Squaring (<strong>d &gt; v-tol &amp;&amp; d &lt; v+tol</strong>) results in: (<strong>d² &gt; (v-tol)² &amp;&amp; d² &lt; (v+tol)²</strong>)<br />In wich we can replace <strong>d²</strong> and the intended value <strong>v ≈ </strong>sqrt(d²) to compare with: <br />(<strong>dSqr=dX²+dY² &gt; (v-tol)² &amp;&amp; dSqr=dX²+dY² &lt; (v+tol)²</strong>)
</p>

<p>
This may fail when <strong>(d == v)</strong>.<br />And always when <strong>tol</strong> is too small to be added or subtracted in floating-point.<br />When comparing (squared) values within a small tolerance we must thus include equality:
</p>
<pre class="code">if (dSqr &gt;= (v-tol)*(v-tol) &amp;&amp; dSqr &lt;= (v+tol)*(v+tol)) {...}</pre>

<p>
Programmatically more complex … <br />… and perhaps no longer a faster method than taking the root.<br />The second test is skipped when the first is true.
</p>

<p>
It certainly avoids the absurd comparison with <strong>1e-18</strong>.<br />Because that is mostly true for real near equal distances.
</p>

<p>
 Regards,<br />CVH<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2740">
    <title>FS#2740: System reverts to &quot;Custom&quot; Printing Page size rather than taking ANSI-A (Letter) or other Named size</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2740</link>
    <dc:date>2026-08-14T11:15:49Z</dc:date>
    <dc:creator>Steven Guttag</dc:creator>
     <description>

I&amp;#039;ve noted that on my (relatively) new Mac Mini (M4), when I open my drawings, it yells at me when I open a block about using a &amp;quot;Custom&amp;quot; paper size.  it should be &amp;quot;A&amp;quot; size (US-Letter).  When I try to set it to ANSI-A (Letter), even after saving, it reverts to &amp;quot;Custom&amp;quot; (though the dimensions remain correct (8.5&amp;quot;x11&amp;quot;)

</description>
    <content:encoded><![CDATA[
<p>
I&#039;ve noted that on my (relatively) new Mac Mini (M4), when I open my drawings, it yells at me when I open a block about using a &quot;Custom&quot; paper size.  it should be &quot;A&quot; size (US-Letter).  When I try to set it to ANSI-A (Letter), even after saving, it reverts to &quot;Custom&quot; (though the dimensions remain correct (8.5&quot;x11&quot;)<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2564">
    <title>FS#2564: REllipse::getVectorTo(p) returns a vector to a major point when p is on the major axis</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2564</link>
    <dc:date>2026-08-10T08:10:57Z</dc:date>
    <dc:creator>CVH</dc:creator>
     <description>

Andrew,



If a given point p is on the major axis then REllipse::getVectorTo(p) returns one of the major points. In the code this is handled as a special case when the point is in-line (collinear) with the major axis. This is only correct for points outside the evolute.



On the major axis is defined by getAngle().This may fail for a magnitude equal to or less than 1e-6.A point that close to the center should not have a single solution at zero degrees.



The correct solutions are:- If p is equal to the center ⇒ Two vectors to the two minor points.- On the major axis and strictly inside the evolute ⇒ Two mirrored vectors.- On the major axis and on or outside the evolute ⇒ The nearest major point.- On the minor axis ⇒ The nearest minor point.



 An additional problem is now what to return on a duality with full ellipses.Or for an ellipse arc where both of two results are valid.getVectorTo() typically returns but one unique result.



For example: RCircle::getVectorTo(p) returns an invalid vector when the point is near the center.Then there are an unlimited number of solutions. 





Further discovered that the point related to the returned vector may fail x²/a²+y²/b²=1Although almost on the ellipse within 2.299e-10 … f(x,y) may return 9.5310This example would fail REllipse::contains while the border is considered as inside.



Meanwhile implemented a &amp;#039;simple method&amp;#039; to find the nearest point(s) on an ellipse.Fast converging in 3 steps, no trigs and very accurate, about 24 lines of code.f(x,y) returns mostly 1.000 with so far:- a minimum of 0.9999999999999997 - a maximum of 1.0000000000000007.In other words, it is only off for the last meaningful decimal digit.



With this all methods that are based on REllipse::getVectorTo(p) can be implemented very reliable with tolerance, border flag, … and so on.By default the normal for a point is given with high accuracy and a tangent is that rotated.… ...



Regards,CVH 


</description>
    <content:encoded><![CDATA[
<p>
Andrew,
</p>

<p>
If a given point p is on the major axis then REllipse::getVectorTo(p) returns one of the major points. In the code this is handled as a special case when the point is in-line (collinear) with the major axis. <br />This is only correct for points outside the evolute.
</p>

<p>
On the major axis is defined by getAngle().<br />This may fail for a magnitude equal to or less than 1e-6.<br />A point that close to the center should not have a single solution at zero degrees.
</p>

<p>
The correct solutions are:<br />- If p is equal to the center ⇒ <strong>Two</strong> vectors to the two minor points.<br />- On the major axis and strictly inside the evolute ⇒ <strong>Two</strong> mirrored vectors.<br />- On the major axis and on or outside the evolute ⇒ The nearest major point.<br />- On the minor axis ⇒ The nearest minor point.
</p>

<p>
 An additional problem is now what to return on a duality with full ellipses.<br />Or for an ellipse arc where both of two results are valid.<br />getVectorTo() typically returns but one unique result.
</p>

<p>
For example: <br />RCircle::getVectorTo(p) returns an invalid vector when the point is near the center.<br />Then there are an unlimited number of solutions. 
</p>
<hr />
<hr />

<p>
Further discovered that the point related to the returned vector may fail x²/a²+y²/b²=1<br />Although almost on the ellipse within 2.299e-10 … f(x,y) may return 9.5310<br />This example would fail REllipse::contains while the border is considered as inside.
</p>

<p>
Meanwhile implemented a &#039;simple method&#039; to find the nearest point(s) on an ellipse.<br />Fast converging in 3 steps, no trigs and very accurate, about 24 lines of code.<br />f(x,y) returns mostly 1.000 with so far:<br />- a minimum of 0.9999999999999997 <br />- a maximum of 1.0000000000000007.<br />In other words, it is only off for the last meaningful decimal digit.
</p>

<p>
With this all methods that are based on REllipse::getVectorTo(p) can be implemented very reliable with tolerance, border flag, … and so on.<br />By default the normal for a point is given with high accuracy and a tangent is that rotated.<br />… ..<br />.
</p>

<p>
Regards,<br />CVH 
</p>
<pre class="code"></pre>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2739">
    <title>FS#2739: High CPU usage under Gnome with Text Size other than 100%</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2739</link>
    <dc:date>2026-08-08T19:16:34Z</dc:date>
    <dc:creator>Andrew</dc:creator>
     <description>

See also:https://forum.qcad.org/t/high-cpu-when-idle-with-no-diagram-loaded-on-linux-wayland/11895 

</description>
    <content:encoded><![CDATA[
<p>
See also:<br /><a href="https://forum.qcad.org/t/high-cpu-when-idle-with-no-diagram-loaded-on-linux-wayland/11895" class="urlextern" title="https://forum.qcad.org/t/high-cpu-when-idle-with-no-diagram-loaded-on-linux-wayland/11895"  rel="nofollow">https://forum.qcad.org/t/high-cpu-when-idle-with-no-diagram-loaded-on-linux-wayland/11895</a> 
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2738">
    <title>FS#2738: Block &gt; Edit block in place: After editing the block, the block reference has draw order 0</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2738</link>
    <dc:date>2026-08-03T19:55:23Z</dc:date>
    <dc:creator>Andrew</dc:creator>
     <description>

See also:https://forum.qcad.org/t/after-editing-a-block-in-place-the-block-loses-its-display-order-in-the-main-drawing/11918 

</description>
    <content:encoded><![CDATA[
<p>
See also:<br /><a href="https://forum.qcad.org/t/after-editing-a-block-in-place-the-block-loses-its-display-order-in-the-main-drawing/11918" class="urlextern" title="https://forum.qcad.org/t/after-editing-a-block-in-place-the-block-loses-its-display-order-in-the-main-drawing/11918"  rel="nofollow">https://forum.qcad.org/t/after-editing-a-block-in-place-the-block-loses-its-display-order-in-the-main-drawing/11918</a> 
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2737">
    <title>FS#2737: System reverts to &quot;Custom&quot; Printing Page size rather than taking ANSI-A (Letter) or other Named size</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2737</link>
    <dc:date>2026-08-03T15:53:03Z</dc:date>
    <dc:creator>Steven Guttag</dc:creator>
     <description>

This may be unique to the ARM version but I&amp;#039;ve noted that with each drawing I open, it flags that I am using a &amp;quot;Custom&amp;quot; page size.  My default Printing-Page is ANSI-A (US-Letter).  I can save that (Application Preferences)…close the program…open it up and while the page dimensions remain correct, the program still reports it as a &amp;quot;Custom&amp;quot; size.  



I see a similar behavior from the Drawing Preferences, with respect to Printing - Page. 



I didn&amp;#039;t start noticing this behavior until I changed my computer to an M4 based Mac Mini running Tahoe.  With that change, I started using the ARM based version of QCAD.  So, I&amp;#039;m wondering if the problem is ARM based rather than on other operating systems, including Intel based Macs, like my previous one. 

</description>
    <content:encoded><![CDATA[
<p>
This may be unique to the ARM version but I&#039;ve noted that with each drawing I open, it flags that I am using a &quot;Custom&quot; page size.  My default Printing-Page is ANSI-A (US-Letter).  I can save that (Application Preferences)…close the program…open it up and while the page dimensions remain correct, the program still reports it as a &quot;Custom&quot; size.  
</p>

<p>
I see a similar behavior from the Drawing Preferences, with respect to Printing - Page. 
</p>

<p>
I didn&#039;t start noticing this behavior until I changed my computer to an M4 based Mac Mini running Tahoe.  With that change, I started using the ARM based version of QCAD.  So, I&#039;m wondering if the problem is ARM based rather than on other operating systems, including Intel based Macs, like my previous one. 
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2734">
    <title>FS#2734: Concerning: Commit 2b1838b</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2734</link>
    <dc:date>2026-07-30T15:11:31Z</dc:date>
    <dc:creator>CVH</dc:creator>
     <description>

RCircle.getVectorTo was modded to avoid the sqrt() in getMagnitude() and used v.getSquaredMagnitude().Then comparing that with the square of the default tolerance (1e-18).Part of Commit d233495



In RCircle::getDistanceTogetDistanceTo2D is based on getMagnitude2D().This should be compared with RS.PointTolerance (1e-9), not squared (1e-18).



! ! !Only true in an arbitrary (unlimited) precision.The method using the magnitude or the squared magnitude cannot be compared in floating point.The squared magnitude will hardly ever have a meaningful 18th digit after the comma.As it is the subtraction of the vector components with no more than 17 significant digits.



A method missing here is RVector::getSquaredMagnitude2D() avoiding + 0.0*0.0 for dz² 





 Here you use a circular tolerance area in 2D: Less than 1e-9 away in any 2D direction.Or a spherical tolerance in 3D.



Positions are typically compared using an axis aligned square shape as tolerance range in 2D (RVector::equalsFuzzy2D) or a cubic box in 3D (RVector::equalsFuzzy): Less than 1e-9 to 1.414214e-9 away in any 2D directionOr less than 1e-9 to 1.732051e-9 away in 3D.40 to 70% more tolerant depending 2 or 3D and the direction.



 Regards,CVH



PS:I can start a comment on GitHub like before but that is no longer accepting inputs.

</description>
    <content:encoded><![CDATA[
<p>
RCircle.getVectorTo was modded to avoid the sqrt() in getMagnitude() and used v.getSquaredMagnitude().<br />Then comparing that with the square of the default tolerance (1e-18).<br />Part of Commit d233495
</p>

<p>
In RCircle::getDistanceTo<br />getDistanceTo2D is based on getMagnitude2D().<br /><strong>This should be compared with RS.PointTolerance (1e-9)</strong>, not squared (1e-18).
</p>

<p>
! ! !<br />Only true in an arbitrary (unlimited) precision.<br />The method using the magnitude or the squared magnitude cannot be compared in floating point.<br />The squared magnitude will hardly ever have a meaningful 18th digit after the comma.<br />As it is the subtraction of the vector components with no more than 17 significant digits.
</p>

<p>
A method missing here is RVector::getSquaredMagnitude2D() avoiding + 0.0*0.0 for dz² 
</p>
<hr />
<hr />

<p>
 Here you use a circular tolerance area in 2D: Less than 1e-9 away in any 2D direction.<br />Or a spherical tolerance in 3D.
</p>

<p>
Positions are typically compared using an axis aligned square shape as tolerance range in 2D (RVector::equalsFuzzy2D) or a cubic box in 3D (RVector::equalsFuzzy): <br />Less than 1e-9 to 1.414214e-9 away in any 2D direction<br />Or less than 1e-9 to 1.732051e-9 away in 3D.<br />40 to 70% more tolerant depending 2 or 3D and the direction.
</p>

<p>
 Regards,<br />CVH
</p>

<p>
PS:<br />I can start a comment on GitHub like before but that is no longer accepting inputs.<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2736">
    <title>FS#2736: REllipse::correctMajorMinor() calls itself one more time, switchMajorMinor() calls it twice</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2736</link>
    <dc:date>2026-07-30T11:14:34Z</dc:date>
    <dc:creator>CVH</dc:creator>
     <description>

Andrew,



Claude included major/minor swapping in REllipse::getVectorTo().This is an existent resource and already used in most cases.I never encountered a major radius less than the minor but it is plausible.



For a ratio over 1.0, correctMajorMinor() caches the minor point (Line 1205).Sets a corrected ratio (Line 1206).And then it sets the major point using REllipse::setMajorPoint() (Line 1207). 



 setMajorPoint() calls REllipse::correctMajorMinor() again.This time the ratio is less than 1.0 and nothing is altered.



 Because correctMajorMinor() is setting things straight it can simply updatethe public attributes: &amp;#039;ratio&amp;#039;, &amp;#039;majorPoint&amp;#039;, &amp;#039;startParam&amp;#039; and &amp;#039;endParam&amp;#039; in this order.



correctMajorMinor() is typically called for:- The valid REllipse constructor.- When setting the REllipse major point, the ratioand thus also when setting the minor point.- When setting the properties of an REllipseEntity. 




There is a second analog to REllipse::correctMajorMinor().



The method REllipse::switchMajorMinor() does practically the same but then based on an external test.In open source only used in RShape::getIntersectionPointsEE (Line 1275 and 1279).Then called when the major radius is less than the minor radius.



The main difference is that it is skipped when the ratio is less than 1e-9.fabs(ratio) in line 314 is odd because a negative ratio is invalid … Not rendered. 



switchMajorMinor() triggers correctMajorMinor() twice.



 It first set the major point equal to the minor point based on the former ratio.This triggers correctMajorMinor().Then it sets the reciprocal of the ratio.This also triggers correctMajorMinor().



switchMajorMinor() can also update the public attributes in direct. 




For the record: REllipse::getTangents also swaps major/minor in direct when the point is on the minor axis. This method handles an ellipse as full and doesn&amp;#039;t correct end parameters.



Regards,CVH

</description>
    <content:encoded><![CDATA[
<p>
Andrew,
</p>

<p>
Claude included major/minor swapping in <strong>REllipse::getVectorTo()</strong>.<br />This is an existent resource and already used in most cases.<br />I never encountered a major radius less than the minor but it is plausible.
</p>

<p>
For a ratio over 1.0, <strong>correctMajorMinor()</strong> caches the minor point (Line 1205).<br />Sets a corrected ratio (Line 1206).<br />And then it sets the major point using <strong>REllipse::setMajorPoint()</strong> (Line 1207). 
</p>
<blockquote><div class="no">
<blockquote><div class="no">
 <strong>setMajorPoint()</strong> calls <strong>REllipse::correctMajorMinor()</strong> again.<br />This time the ratio is less than 1.0 and nothing is altered.</div></blockquote>
</div></blockquote>

<p>
 Because <strong>correctMajorMinor()</strong> is setting things straight it can simply update<br />the public attributes: &#039;ratio&#039;, &#039;majorPoint&#039;, &#039;startParam&#039; and &#039;endParam&#039; in this order.
</p>

<p>
<strong>correctMajorMinor()</strong> is typically called for:<br />- The valid REllipse constructor.<br />- When setting the REllipse major point, the ratio<br />and thus also when setting the minor point.<br />- When setting the properties of an REllipseEntity. 
</p>
<hr />

<p>
There is a second analog to <strong>REllipse::correctMajorMinor()</strong>.
</p>

<p>
The method <strong>REllipse::switchMajorMinor()</strong> does practically the same but then based on an external test.<br />In open source only used in <strong>RShape::getIntersectionPointsEE</strong> (Line 1275 and 1279).<br />Then called when the major radius is less than the minor radius.
</p>

<p>
The main difference is that it is skipped when the ratio is less than 1e-9.<br />fabs(ratio) in line 314 is odd because a negative ratio is invalid … Not rendered. 
</p>
<blockquote><div class="no">
<blockquote><div class="no">
<strong>switchMajorMinor()</strong> triggers <strong>correctMajorMinor()</strong> twice.</div></blockquote>
</div></blockquote>

<p>
 It first set the major point equal to the minor point based on the former ratio.<br />This triggers <strong>correctMajorMinor()</strong>.<br />Then it sets the reciprocal of the ratio.<br />This also triggers <strong>correctMajorMinor()</strong>.
</p>

<p>
<strong>switchMajorMinor()</strong> can also update the public attributes in direct. 
</p>
<hr />

<p>
For the record: <strong>REllipse::getTangents</strong> also swaps major/minor in direct when the point is on the minor axis. This method handles an ellipse as full and doesn&#039;t correct end parameters.
</p>

<p>
Regards,<br />CVH
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2735">
    <title>FS#2735: File &gt; Open: Frozen layer states from viewports are not loaded for empty layers</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2735</link>
    <dc:date>2026-07-29T17:11:06Z</dc:date>
    <dc:creator>Andrew</dc:creator>
     <description>

1. Freeze an empty layer in a viewport2. Save3. Reopen



Layer is not frozen.



See also:https://forum.qcad.org/t/manage-viewport-layers-not-persisting-save-and-reopen/11902 

</description>
    <content:encoded><![CDATA[
<p>
1. Freeze an empty layer in a viewport<br />2. Save<br />3. Reopen
</p>

<p>
Layer is not frozen.
</p>

<p>
See also:<br /><a href="https://forum.qcad.org/t/manage-viewport-layers-not-persisting-save-and-reopen/11902" class="urlextern" title="https://forum.qcad.org/t/manage-viewport-layers-not-persisting-save-and-reopen/11902"  rel="nofollow">https://forum.qcad.org/t/manage-viewport-layers-not-persisting-save-and-reopen/11902</a> 
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2733">
    <title>FS#2733: Transparent black or white entities lose transparency with color correction</title>
    <link>https://www.ribbonsoft.com/bugtracker/index.php?do=details&amp;task_id=2733</link>
    <dc:date>2026-07-01T09:37:52Z</dc:date>
    <dc:creator>Andrew</dc:creator>
     <description>

Color correction strips the alpha channel.



See:https://forum.qcad.org/t/qcad-shading-of-hatches/11828 

</description>
    <content:encoded><![CDATA[
<p>
Color correction strips the alpha channel.
</p>

<p>
See:<br /><a href="https://forum.qcad.org/t/qcad-shading-of-hatches/11828" class="urlextern" title="https://forum.qcad.org/t/qcad-shading-of-hatches/11828"  rel="nofollow">https://forum.qcad.org/t/qcad-shading-of-hatches/11828</a> 
</p>
]]></content:encoded>
  </item>
  </rdf:RDF>
