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