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
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits