Revision: 62231
          http://sourceforge.net/p/brlcad/code/62231
Author:   indianlarry
Date:     2014-08-19 14:08:41 +0000 (Tue, 19 Aug 2014)
Log Message:
-----------
Added work around for case where OpenNURBS routines not returning normals for 
valid points along a trim.

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/PullbackCurve.cpp
    brlcad/trunk/src/librt/primitives/brep/brep.cpp

Modified: brlcad/trunk/src/libbrep/PullbackCurve.cpp
===================================================================
--- brlcad/trunk/src/libbrep/PullbackCurve.cpp  2014-08-19 13:21:19 UTC (rev 
62230)
+++ brlcad/trunk/src/libbrep/PullbackCurve.cpp  2014-08-19 14:08:41 UTC (rev 
62231)
@@ -209,6 +209,17 @@
            } else if (side == 3) {
                rc=surf->EvNormal(u.m_t[0], v.m_t[0], point, normal, side, 
hint);
            }
+       } else {
+           /*
+            * brute force and try to solve from each side of the surface domain
+            */
+           ON_Interval u = surf->Domain(0);
+           ON_Interval v = surf->Domain(1);
+           for(int iside=1; iside <= 4; iside++) {
+               rc=surf->EvNormal(s, t, point, normal, iside, hint);
+               if (rc)
+                   break;
+           }
        }
     }
     return rc;

Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp
===================================================================
--- brlcad/trunk/src/librt/primitives/brep/brep.cpp     2014-08-19 13:21:19 UTC 
(rev 62230)
+++ brlcad/trunk/src/librt/primitives/brep/brep.cpp     2014-08-19 14:08:41 UTC 
(rev 62231)
@@ -2287,6 +2287,30 @@
                (*param_points)[1.0] = new ON_3dPoint(
                    s->PointAt(trim.PointAt(range.m_t[1]).x,
                               trim.PointAt(range.m_t[1]).y));
+           } else {
+               start_2d = trim.PointAt(range.m_t[0]);
+               end_2d = trim.PointAt(range.m_t[1]);
+               start_3d = s->PointAt(start_2d.x,start_2d.y);
+               end_3d = s->PointAt(end_2d.x,end_2d.y);
+               mid_2d = trim.PointAt(mid_range);
+               mid_3d =  s->PointAt(mid_2d.x, mid_2d.y);
+               (*param_points)[0.0] = new ON_3dPoint(
+                   s->PointAt(trim.PointAt(range.m_t[0]).x,
+                              trim.PointAt(range.m_t[0]).y));
+               getEdgePoints(trim, range.m_t[0], start_2d, start_tang,
+                             start_3d, start_norm, mid_range, mid_2d, mid_tang,
+                             mid_3d, mid_norm, min_dist, max_dist, within_dist,
+                             cos_within_ang, *param_points);
+               (*param_points)[0.5] = new ON_3dPoint(
+                   s->PointAt(trim.PointAt(mid_range).x,
+                              trim.PointAt(mid_range).y));
+               getEdgePoints(trim, mid_range, mid_2d, mid_tang, mid_3d,
+                             mid_norm, range.m_t[1], end_2d, end_tang, end_3d,
+                             end_norm, min_dist, max_dist, within_dist,
+                             cos_within_ang, *param_points);
+               (*param_points)[1.0] = new ON_3dPoint(
+                   s->PointAt(trim.PointAt(range.m_t[1]).x,
+                              trim.PointAt(range.m_t[1]).y));
            }
        } else {
            ON_3dPoint start_2d(0.0, 0.0, 0.0);
@@ -2308,6 +2332,17 @@
                              end_3d, end_norm, min_dist, max_dist, within_dist,
                              cos_within_ang, *param_points);
                (*param_points)[1.0] = new ON_3dPoint(end_3d);
+           } else {
+               start_2d = trim.PointAt(range.m_t[0]);
+               end_2d = trim.PointAt(range.m_t[1]);
+               start_3d = s->PointAt(start_2d.x,start_2d.y);
+               end_3d = s->PointAt(end_2d.x,end_2d.y);
+               (*param_points)[0.0] = new ON_3dPoint(start_3d);
+               getEdgePoints(trim, range.m_t[0], start_2d, start_tang,
+                             start_3d, start_norm, range.m_t[1], end_2d, 
end_tang,
+                             end_3d, end_norm, min_dist, max_dist, within_dist,
+                             cos_within_ang, *param_points);
+               (*param_points)[1.0] = new ON_3dPoint(end_3d);
            }
        }
     } else {

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to