Revision: 76227
          http://sourceforge.net/p/brlcad/code/76227
Author:   starseeker
Date:     2020-06-26 18:28:40 +0000 (Fri, 26 Jun 2020)
Log Message:
-----------
Start working on exposing line snapping up through tclcad.  Looks like grid 
drawing may have gotten broken...

Modified Paths:
--------------
    brlcad/trunk/include/dm/bview.h
    brlcad/trunk/include/ged/view.h
    brlcad/trunk/src/libged/ged.c
    brlcad/trunk/src/libged/grid.c
    brlcad/trunk/src/libged/view/snap.c
    brlcad/trunk/src/libtclcad/tclcad_obj.c

Modified: brlcad/trunk/include/dm/bview.h
===================================================================
--- brlcad/trunk/include/dm/bview.h     2020-06-26 17:11:19 UTC (rev 76226)
+++ brlcad/trunk/include/dm/bview.h     2020-06-26 18:28:40 UTC (rev 76227)
@@ -253,6 +253,7 @@
     struct bview_data_axes_state        gv_sdata_axes;
     struct bview_data_label_state gv_sdata_labels;
     struct bview_data_line_state  gv_sdata_lines;
+    int                           gv_snap_lines;
     double                       gv_snap_tol_factor;
     bview_data_polygon_state      gv_sdata_polygons;
     struct bview_grid_state     gv_grid;

Modified: brlcad/trunk/include/ged/view.h
===================================================================
--- brlcad/trunk/include/ged/view.h     2020-06-26 17:11:19 UTC (rev 76226)
+++ brlcad/trunk/include/ged/view.h     2020-06-26 18:28:40 UTC (rev 76227)
@@ -77,7 +77,7 @@
 GED_EXPORT extern void ged_view_init(struct bview *gvp);
 
 /* defined in grid.c */
-GED_EXPORT extern void ged_snap_to_grid(struct ged *gedp, fastf_t *vx, fastf_t 
*vy);
+GED_EXPORT extern int ged_snap_to_grid(struct ged *gedp, fastf_t *vx, fastf_t 
*vy);
 
 /**
  * Grid utility command.
@@ -155,6 +155,10 @@
 GED_EXPORT extern int ged_polygons_overlap(struct ged *gedp, bview_polygon 
*polyA, bview_polygon *polyB);
 GED_EXPORT extern void ged_polygon_fill_segments(struct ged *gedp, 
bview_polygon *poly, vect2d_t vfilldir, fastf_t vfilldelta);
 
+// TODO - this (and probably the grid logic too) belong at the libdm level - 
they're operating
+// on the bview, rather than the ged level data...
+GED_EXPORT extern int ged_snap_to_lines(struct ged *gedp, fastf_t *vx, fastf_t 
*vy);
+
 __END_DECLS
 
 #endif /* GED_VIEW_H */

Modified: brlcad/trunk/src/libged/ged.c
===================================================================
--- brlcad/trunk/src/libged/ged.c       2020-06-26 17:11:19 UTC (rev 76226)
+++ brlcad/trunk/src/libged/ged.c       2020-06-26 18:28:40 UTC (rev 76227)
@@ -378,6 +378,7 @@
 
     // Higher values indicate more aggressive behavior (i.e. points further 
away will be snapped).
     gvp->gv_snap_tol_factor = 10;
+    gvp->gv_snap_lines = 0;
 
     ged_view_update(gvp);
 }

Modified: brlcad/trunk/src/libged/grid.c
===================================================================
--- brlcad/trunk/src/libged/grid.c      2020-06-26 17:11:19 UTC (rev 76226)
+++ brlcad/trunk/src/libged/grid.c      2020-06-26 18:28:40 UTC (rev 76227)
@@ -34,7 +34,7 @@
 #include "./ged_private.h"
 
 
-void
+int
 ged_snap_to_grid(struct ged *gedp, fastf_t *vx, fastf_t *vy)
 {
     int nh, nv;                /* whole grid units */
@@ -46,11 +46,11 @@
     fastf_t inv_sf;
 
     if (gedp->ged_gvp == GED_VIEW_NULL)
-       return;
+       return 0;
 
     if (ZERO(gedp->ged_gvp->gv_grid.res_h) ||
        ZERO(gedp->ged_gvp->gv_grid.res_v))
-       return;
+       return 0;
 
     sf = gedp->ged_gvp->gv_scale*gedp->ged_wdbp->dbip->dbi_base2local;
     inv_sf = 1 / sf;
@@ -85,6 +85,8 @@
 
     *vx *= inv_sf;
     *vy *= inv_sf;
+
+    return 1;
 }
 
 

Modified: brlcad/trunk/src/libged/view/snap.c
===================================================================
--- brlcad/trunk/src/libged/view/snap.c 2020-06-26 17:11:19 UTC (rev 76226)
+++ brlcad/trunk/src/libged/view/snap.c 2020-06-26 18:28:40 UTC (rev 76227)
@@ -235,6 +235,30 @@
 }
 
 int
+ged_snap_to_lines(struct ged *gedp, fastf_t *vx, fastf_t *vy)
+{
+    if (!gedp || !vx || !vy) return 0;
+    if (!gedp->ged_gvp) return 0;
+
+    point2d_t p2d = {0.0, 0.0};
+    point_t p = VINIT_ZERO;
+    point_t vp = VINIT_ZERO;
+    point_t out_pt = VINIT_ZERO;
+
+    V2SET(p2d, *vx, *vy);
+    VSET(vp, p2d[0], p2d[1], 0);
+    MAT4X3PNT(p, gedp->ged_gvp->gv_view2model, vp);
+    if (ged_snap_lines(&out_pt, gedp, &p) == GED_OK) {
+       MAT4X3PNT(vp, gedp->ged_gvp->gv_model2view, out_pt);
+       (*vx) = p[0];
+       (*vy) = p[1];
+       return 1;
+    }
+
+    return 0;
+}
+
+int
 ged_view_snap(struct ged *gedp, int argc, const char *argv[])
 {
     static const char *usage = "[options] x y [z]";
@@ -368,6 +392,8 @@
 }
 
 
+
+
 /*
  * Local Variables:
  * tab-width: 8

Modified: brlcad/trunk/src/libtclcad/tclcad_obj.c
===================================================================
--- brlcad/trunk/src/libtclcad/tclcad_obj.c     2020-06-26 17:11:19 UTC (rev 
76226)
+++ brlcad/trunk/src/libtclcad/tclcad_obj.c     2020-06-26 18:28:40 UTC (rev 
76227)
@@ -7439,8 +7439,13 @@
     VSET(view, x, y, 0.0);
 
     gedp->ged_gvp = gdvp->gdv_view;
-    if (gedp->ged_gvp->gv_grid.snap)
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &view[X], &view[Y]);
+    }
+    if (!snapped && gedp->ged_gvp->gv_grid.snap) {
        ged_snap_to_grid(gedp, &view[X], &view[Y]);
+    }
 
     bu_vls_printf(&pt_vls, "%lf %lf %lf", view[X], view[Y], view[Z]);
 
@@ -9550,7 +9555,12 @@
 
     fx = screen_to_view_x(gdvp->gdv_dmp, x);
     fy = screen_to_view_y(gdvp->gdv_dmp, y);
-    if (gedp->ged_gvp->gv_grid.snap) {
+
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &fx, &fy);
+    }
+    if (!snapped && gedp->ged_gvp->gv_grid.snap) {
        ged_snap_to_grid(gedp, &fx, &fy);
     }
 
@@ -9865,7 +9875,11 @@
 
     fx = screen_to_view_x(gdvp->gdv_dmp, x);
     fy = screen_to_view_y(gdvp->gdv_dmp, y);
-    if (gedp->ged_gvp->gv_grid.snap) {
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &fx, &fy);
+    }
+    if (!snapped && gedp->ged_gvp->gv_grid.snap) {
        ged_snap_to_grid(gedp, &fx, &fy);
     }
 
@@ -10046,10 +10060,15 @@
 
     fx = screen_to_view_x(gdvp->gdv_dmp, x);
     fy = screen_to_view_y(gdvp->gdv_dmp, y);
-    if (gedp->ged_gvp->gv_grid.snap) {
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &fx, &fy);
+    }
+    if (!snapped && gedp->ged_gvp->gv_grid.snap) {
        ged_snap_to_grid(gedp, &fx, &fy);
     }
 
+
     if (gdvp->gdv_view->gv_mode == TCLCAD_POLY_SQUARE_MODE) {
        fastf_t dx, dy;
 
@@ -12074,8 +12093,13 @@
     fx = screen_to_view_x(gdvp->gdv_dmp, x);
     fy = screen_to_view_y(gdvp->gdv_dmp, y);
     VSET(v_pt, fx, fy, gdvp->gdv_view->gv_data_vZ);
-    if (gedp->ged_gvp->gv_grid.snap)
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &v_pt[X], &v_pt[Y]);
+    }
+    if (!snapped && gedp->ged_gvp->gv_grid.snap) {
        ged_snap_to_grid(gedp, &v_pt[X], &v_pt[Y]);
+    }
 
     MAT4X3PNT(m_pt, gdvp->gdv_view->gv_view2model, v_pt);
     VMOVE(gdpsp->gdps_prev_point, v_pt);
@@ -12217,8 +12241,13 @@
     fx = screen_to_view_x(gdvp->gdv_dmp, x);
     fy = screen_to_view_y(gdvp->gdv_dmp, y);
     VSET(v_pt, fx, fy, gdvp->gdv_view->gv_data_vZ);
-    if (gedp->ged_gvp->gv_grid.snap)
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &v_pt[X], &v_pt[Y]);
+    }
+    if (!snapped && gedp->ged_gvp->gv_grid.snap) {
        ged_snap_to_grid(gedp, &v_pt[X], &v_pt[Y]);
+    }
 
     MAT4X3PNT(m_pt, gdvp->gdv_view->gv_view2model, v_pt);
 
@@ -12495,8 +12524,13 @@
     fx = screen_to_view_x(gdvp->gdv_dmp, x);
     fy = screen_to_view_y(gdvp->gdv_dmp, y);
     VSET(v_pt, fx, fy, gdvp->gdv_view->gv_data_vZ);
-    if (gedp->ged_gvp->gv_grid.snap)
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &v_pt[X], &v_pt[Y]);
+    }
+    if (!snapped && gedp->ged_gvp->gv_grid.snap) {
        ged_snap_to_grid(gedp, &v_pt[X], &v_pt[Y]);
+    }
 
     MAT4X3PNT(m_pt, gdvp->gdv_view->gv_view2model, v_pt);
     VMOVE(gdpsp->gdps_prev_point, v_pt);
@@ -12661,8 +12695,13 @@
     fx = screen_to_view_x(gdvp->gdv_dmp, x);
     fy = screen_to_view_y(gdvp->gdv_dmp, y);
     VSET(v_pt, fx, fy, gdvp->gdv_view->gv_data_vZ);
-    if (gedp->ged_gvp->gv_grid.snap)
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &v_pt[X], &v_pt[Y]);
+    }
+    if (!snapped && gedp->ged_gvp->gv_grid.snap) {
        ged_snap_to_grid(gedp, &v_pt[X], &v_pt[Y]);
+    }
 
     MAT4X3PNT(m_pt, gdvp->gdv_view->gv_view2model, v_pt);
     VMOVE(gdpsp->gdps_prev_point, v_pt);
@@ -13737,7 +13776,14 @@
        return GED_OK;
     }
 
-    ged_snap_to_grid(gedp, &fvx, &fvy);
+    int snapped = 0;
+    if (gedp->ged_gvp->gv_snap_lines) {
+       snapped = ged_snap_to_lines(gedp, &fvx, &fvy);
+    }
+    if (!snapped) {
+       ged_snap_to_grid(gedp, &fvx, &fvy);
+    }
+
     bu_vls_printf(gedp->ged_result_str, "%lf %lf", fvx, fvy);
 
     return GED_OK;

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



_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to