Revision: 76429
http://sourceforge.net/p/brlcad/code/76429
Author: starseeker
Date: 2020-07-22 20:55:20 +0000 (Wed, 22 Jul 2020)
Log Message:
-----------
whoops, missed adding files
Added Paths:
-----------
brlcad/branches/gedplugins/src/libged/metaball/CMakeLists.txt
brlcad/branches/gedplugins/src/libged/pipe.c
Added: brlcad/branches/gedplugins/src/libged/metaball/CMakeLists.txt
===================================================================
--- brlcad/branches/gedplugins/src/libged/metaball/CMakeLists.txt
(rev 0)
+++ brlcad/branches/gedplugins/src/libged/metaball/CMakeLists.txt
2020-07-22 20:55:20 UTC (rev 76429)
@@ -0,0 +1,26 @@
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${BRLCAD_BINARY_DIR}/include
+ ${BRLCAD_SOURCE_DIR}/include
+ ${BU_INCLUDE_DIRS}
+ ${GED_INCLUDE_DIRS}
+ )
+
+add_definitions(-DGED_PLUGIN)
+ged_plugin_library(ged-metaball SHARED metaball.c)
+target_link_libraries(ged-metaball libged libbu)
+set_property(TARGET ged-metaball APPEND PROPERTY COMPILE_DEFINITIONS
BRLCADBUILD HAVE_CONFIG_H)
+VALIDATE_STYLE(ged-metaball metaball.c)
+PLUGIN_SETUP(ged-metaball ged)
+
+CMAKEFILES(
+ CMakeLists.txt
+ metaball.c
+ )
+
+# Local Variables:
+# tab-width: 8
+# mode: cmake
+# indent-tabs-mode: t
+# End:
+# ex: shiftwidth=2 tabstop=8
Property changes on:
brlcad/branches/gedplugins/src/libged/metaball/CMakeLists.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: brlcad/branches/gedplugins/src/libged/pipe.c
===================================================================
--- brlcad/branches/gedplugins/src/libged/pipe.c
(rev 0)
+++ brlcad/branches/gedplugins/src/libged/pipe.c 2020-07-22 20:55:20 UTC
(rev 76429)
@@ -0,0 +1,686 @@
+/* P I P E . C
+ * BRL-CAD
+ *
+ * Copyright (c) 1995-2020 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this file; see the file named COPYING for more
+ * information.
+ */
+/** @file libged/edpipe.c
+ *
+ * Functions -
+ *
+ * pipe_split_pnt - split a pipe segment at a given point
+ *
+ * find_pipe_pnt_nearest_pnt - find which segment of a pipe is nearest
+ * the ray from "pt" in the viewing direction (for segment selection
+ * in MGED)
+ */
+
+#include "common.h"
+
+#include <math.h>
+#include <string.h>
+
+#include "vmath.h"
+#include "nmg.h"
+#include "rt/geom.h"
+#include "ged.h"
+#include "wdb.h"
+
+#include "./ged_private.h"
+
+/*
+ * Returns the index for the pipe segment matching ps.
+ */
+int
+_ged_get_pipe_i_seg(struct rt_pipe_internal *pipeip, struct wdb_pipe_pnt *ps)
+{
+ struct wdb_pipe_pnt *curr_ps;
+ int seg_i = 0;
+
+ for (BU_LIST_FOR(curr_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ if (curr_ps == ps)
+ return seg_i;
+
+ ++seg_i;
+ }
+
+ return -1;
+}
+
+
+/*
+ * Returns segment seg_i.
+ */
+struct wdb_pipe_pnt *
+_ged_get_pipe_seg_i(struct rt_pipe_internal *pipeip, int seg_i)
+{
+ int i = 0;
+ struct wdb_pipe_pnt *curr_ps;
+
+ for (BU_LIST_FOR(curr_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ if (i == seg_i)
+ return curr_ps;
+
+ ++i;
+ }
+
+ return (struct wdb_pipe_pnt *)NULL;
+}
+
+
+void
+pipe_split_pnt(struct bu_list *UNUSED(pipe_hd), struct wdb_pipe_pnt
*UNUSED(ps), fastf_t *UNUSED(new_pt))
+{
+ bu_log("WARNING: pipe splitting unimplemented\n");
+}
+
+
+static fastf_t
+edpipe_scale(fastf_t d, fastf_t scale)
+{
+ if (scale < 0.0) {
+ /* negative value sets the scale */
+ return (-scale);
+ }
+
+ /* positive value gets multiplied */
+ return (d * scale);
+}
+
+
+void
+pipe_scale_od(struct rt_pipe_internal *pipeip, fastf_t scale)
+{
+ struct wdb_pipe_pnt *ps;
+
+ RT_PIPE_CK_MAGIC(pipeip);
+
+ /* check that this can be done */
+ for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ fastf_t tmp_od;
+
+ tmp_od = edpipe_scale(ps->pp_od, scale);
+
+ if (ps->pp_id > tmp_od) {
+ /* Silently ignore */
+ return;
+ }
+ if (tmp_od > 2.0*ps->pp_bendradius) {
+ /* Silently ignore */
+ return;
+ }
+ }
+
+ for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ ps->pp_od = edpipe_scale(ps->pp_od, scale);
+ }
+}
+
+
+void
+pipe_scale_id(struct rt_pipe_internal *pipeip, fastf_t scale)
+{
+ struct wdb_pipe_pnt *ps;
+
+ RT_PIPE_CK_MAGIC(pipeip);
+
+ /* check that this can be done */
+ for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ fastf_t tmp_id;
+
+ tmp_id = edpipe_scale(ps->pp_id, scale);
+
+ if (ps->pp_od < tmp_id) {
+ /* Silently ignore */
+ return;
+ }
+ if (tmp_id > 2.0*ps->pp_bendradius) {
+ /* Silently ignore */
+ return;
+ }
+ }
+
+ for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ ps->pp_id = edpipe_scale(ps->pp_id, scale);
+ }
+}
+
+
+void
+pipe_seg_scale_od(struct wdb_pipe_pnt *ps, fastf_t scale)
+{
+ fastf_t tmp_od;
+
+ BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe segment");
+
+ tmp_od = edpipe_scale(ps->pp_od, scale);
+
+ /* need to check that the new OD is not less than ID
+ * of any affected segment.
+ */
+ if (ps->pp_id > tmp_od) {
+ bu_log("Cannot make OD smaller than ID\n");
+ return;
+ }
+ if (tmp_od > 2.0*ps->pp_bendradius) {
+ bu_log("Cannot make outer radius greater than bend radius\n");
+ return;
+ }
+
+ ps->pp_od = edpipe_scale(ps->pp_od, scale);
+}
+
+
+void
+pipe_seg_scale_id(struct wdb_pipe_pnt *ps, fastf_t scale)
+{
+ fastf_t tmp_id;
+
+ BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe segment");
+
+ tmp_id = edpipe_scale(ps->pp_id, scale);
+
+ /* need to check that the new ID is not greater than OD */
+ if (ps->pp_od < tmp_id) {
+ bu_log( "Cannot make ID greater than OD\n");
+ return;
+ }
+ if (tmp_id > 2.0*ps->pp_bendradius) {
+ bu_log("Cannot make inner radius greater than bend radius\n");
+ return;
+ }
+
+ ps->pp_id = edpipe_scale(ps->pp_id, scale);
+}
+
+
+void
+pipe_seg_scale_radius(struct wdb_pipe_pnt *ps, fastf_t scale)
+{
+ fastf_t old_radius;
+ struct wdb_pipe_pnt *head;
+
+ BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe point");
+
+ head = ps;
+ while (head->l.magic != BU_LIST_HEAD_MAGIC)
+ head = BU_LIST_NEXT(wdb_pipe_pnt, &head->l);
+
+ /* make sure we can make this change */
+ old_radius = ps->pp_bendradius;
+
+ ps->pp_bendradius = edpipe_scale(ps->pp_bendradius, scale);
+
+ if (ps->pp_bendradius < ps->pp_od * 0.5) {
+ bu_log("Cannot make bend radius less than pipe outer radius\n");
+ ps->pp_bendradius = old_radius;
+ return;
+ }
+
+ if (rt_pipe_ck(&head->l)) {
+ /* won't work, go back to original radius */
+ ps->pp_bendradius = old_radius;
+ return;
+ }
+}
+
+
+void
+pipe_scale_radius(struct rt_pipe_internal *pipeip, fastf_t scale)
+{
+ struct bu_list head;
+ struct wdb_pipe_pnt *old_ps, *new_ps;
+
+ RT_PIPE_CK_MAGIC(pipeip);
+
+ /* make a quick check for minimum bend radius */
+ for (BU_LIST_FOR(old_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ if (scale < 0.0) {
+ if ((-scale) < old_ps->pp_od * 0.5) {
+ bu_log("Cannot make bend radius less than pipe outer radius\n");
+ return;
+ }
+ } else {
+ if (old_ps->pp_bendradius * scale < old_ps->pp_od * 0.5) {
+ bu_log("Cannot make bend radius less than pipe outer radius\n");
+ return;
+ }
+ }
+ }
+
+ /* make temporary copy of this pipe solid */
+ BU_LIST_INIT(&head);
+ for (BU_LIST_FOR(old_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ BU_GET(new_ps, struct wdb_pipe_pnt);
+ *new_ps = (*old_ps);
+ BU_LIST_APPEND(&head, &new_ps->l);
+ }
+
+ /* make the desired editing changes to the copy */
+ for (BU_LIST_FOR(new_ps, wdb_pipe_pnt, &head)) {
+ new_ps->pp_bendradius = edpipe_scale(new_ps->pp_bendradius, scale);
+ }
+
+ /* check if the copy is O.K. */
+ if (rt_pipe_ck(&head)) {
+ /* won't work, go back to original */
+ while (BU_LIST_NON_EMPTY(&head)) {
+ new_ps = BU_LIST_FIRST(wdb_pipe_pnt, &head);
+ BU_LIST_DEQUEUE(&new_ps->l);
+ BU_PUT(new_ps, struct wdb_pipe_pnt);
+ }
+ return;
+ }
+
+ /* free temporary pipe solid */
+ while (BU_LIST_NON_EMPTY(&head)) {
+ new_ps = BU_LIST_FIRST(wdb_pipe_pnt, &head);
+ BU_LIST_DEQUEUE(&new_ps->l);
+ BU_PUT(new_ps, struct wdb_pipe_pnt);
+ }
+
+ /* make changes to the original */
+ for (BU_LIST_FOR(old_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ old_ps->pp_bendradius = edpipe_scale(old_ps->pp_bendradius, scale);
+ }
+}
+
+
+struct wdb_pipe_pnt *
+find_pipe_pnt_nearest_pnt(const struct bu_list *pipe_hd, const point_t
model_pt, matp_t view2model)
+{
+ struct wdb_pipe_pnt *ps;
+ struct wdb_pipe_pnt *nearest=(struct wdb_pipe_pnt *)NULL;
+ struct bn_tol tmp_tol;
+ fastf_t min_dist = MAX_FASTF;
+ vect_t dir, work;
+
+ tmp_tol.magic = BN_TOL_MAGIC;
+ tmp_tol.dist = 0.0;
+ tmp_tol.dist_sq = tmp_tol.dist * tmp_tol.dist;
+ tmp_tol.perp = 0.0;
+ tmp_tol.para = 1.0 - tmp_tol.perp;
+
+ /* get a direction vector in model space corresponding to z-direction in
view */
+ VSET(work, 0.0, 0.0, 1.0);
+ MAT4X3VEC(dir, view2model, work);
+
+ for (BU_LIST_FOR(ps, wdb_pipe_pnt, pipe_hd)) {
+ fastf_t dist;
+
+ dist = bn_dist_line3_pnt3(model_pt, dir, ps->pp_coord);
+ if (dist < min_dist) {
+ min_dist = dist;
+ nearest = ps;
+ }
+ }
+
+ return nearest;
+}
+
+
+struct wdb_pipe_pnt *
+_ged_pipe_add_pnt(struct rt_pipe_internal *pipeip, struct wdb_pipe_pnt *pp,
const point_t new_pt)
+{
+ struct wdb_pipe_pnt *last;
+ struct wdb_pipe_pnt *newpp;
+
+ RT_PIPE_CK_MAGIC(pipeip);
+
+ if (pp) {
+ BU_CKMAG(pp, WDB_PIPESEG_MAGIC, "pipe point");
+ last = pp;
+ } else {
+ /* add new point to end of pipe solid */
+ last = BU_LIST_LAST(wdb_pipe_pnt, &pipeip->pipe_segs_head);
+
+ if (last->l.magic == BU_LIST_HEAD_MAGIC) {
+ BU_GET(newpp, struct wdb_pipe_pnt);
+ newpp->l.magic = WDB_PIPESEG_MAGIC;
+ newpp->pp_od = 30.0;
+ newpp->pp_id = 0.0;
+ newpp->pp_bendradius = 40.0;
+ VMOVE(newpp->pp_coord, new_pt);
+ BU_LIST_INSERT(&pipeip->pipe_segs_head, &newpp->l);
+ return newpp;
+ }
+ }
+
+ /* build new point */
+ BU_GET(newpp, struct wdb_pipe_pnt);
+ newpp->l.magic = WDB_PIPESEG_MAGIC;
+ newpp->pp_od = last->pp_od;
+ newpp->pp_id = last->pp_id;
+ newpp->pp_bendradius = last->pp_bendradius;
+ VMOVE(newpp->pp_coord, new_pt);
+
+ if (pp) {
+ /* append after current point */
+ BU_LIST_APPEND(&pp->l, &newpp->l);
+ } else {
+ /* add to end of pipe solid */
+ BU_LIST_INSERT(&pipeip->pipe_segs_head, &newpp->l);
+ }
+
+ if (rt_pipe_ck(&pipeip->pipe_segs_head)) {
+ /* won't work here, so refuse to do it */
+ BU_LIST_DEQUEUE(&newpp->l);
+ BU_PUT(newpp, struct wdb_pipe_pnt);
+ return pp;
+ }
+
+ return newpp;
+}
+
+
+struct wdb_pipe_pnt *
+_ged_pipe_ins_pnt(struct rt_pipe_internal *pipeip, struct wdb_pipe_pnt *pp,
const point_t new_pt)
+{
+ struct wdb_pipe_pnt *first;
+ struct wdb_pipe_pnt *newpp;
+
+ RT_PIPE_CK_MAGIC(pipeip);
+
+ if (pp) {
+ BU_CKMAG(pp, WDB_PIPESEG_MAGIC, "pipe point");
+ first = pp;
+ } else {
+ /* insert new point at start of pipe solid */
+ first = BU_LIST_FIRST(wdb_pipe_pnt, &pipeip->pipe_segs_head);
+
+ if (first->l.magic == BU_LIST_HEAD_MAGIC) {
+ BU_GET(newpp, struct wdb_pipe_pnt);
+ newpp->l.magic = WDB_PIPESEG_MAGIC;
+ newpp->pp_od = 30.0;
+ newpp->pp_id = 0.0;
+ newpp->pp_bendradius = 40.0;
+ VMOVE(newpp->pp_coord, new_pt);
+ BU_LIST_APPEND(&pipeip->pipe_segs_head, &newpp->l);
+ return newpp;
+ }
+ }
+
+ /* build new point */
+ BU_GET(newpp, struct wdb_pipe_pnt);
+ newpp->l.magic = WDB_PIPESEG_MAGIC;
+ newpp->pp_od = first->pp_od;
+ newpp->pp_id = first->pp_id;
+ newpp->pp_bendradius = first->pp_bendradius;
+ VMOVE(newpp->pp_coord, new_pt);
+
+ if (pp) {
+ /* insert before current point */
+ BU_LIST_INSERT(&pp->l, &newpp->l);
+ } else {
+ /* add to start of pipe */
+ BU_LIST_APPEND(&pipeip->pipe_segs_head, &newpp->l);
+ }
+
+ if (rt_pipe_ck(&pipeip->pipe_segs_head)) {
+ /* won't work here, so refuse to do it */
+ BU_LIST_DEQUEUE(&newpp->l);
+ BU_PUT(newpp, struct wdb_pipe_pnt);
+ return pp;
+ }
+
+ return newpp;
+}
+
+
+struct wdb_pipe_pnt *
+_ged_pipe_delete_pnt(struct wdb_pipe_pnt *ps)
+{
+ struct wdb_pipe_pnt *next;
+ struct wdb_pipe_pnt *prev;
+ struct wdb_pipe_pnt *head;
+
+ BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe segment");
+
+ head = ps;
+ while (head->l.magic != BU_LIST_HEAD_MAGIC)
+ head = BU_LIST_NEXT(wdb_pipe_pnt, &head->l);
+
+ next = BU_LIST_NEXT(wdb_pipe_pnt, &ps->l);
+ if (next->l.magic == BU_LIST_HEAD_MAGIC)
+ next = (struct wdb_pipe_pnt *)NULL;
+
+ prev = BU_LIST_PREV(wdb_pipe_pnt, &ps->l);
+ if (prev->l.magic == BU_LIST_HEAD_MAGIC)
+ prev = (struct wdb_pipe_pnt *)NULL;
+
+ if (!prev && !next) {
+ bu_log("Cannot delete last point in pipe\n");
+ return ps;
+ }
+
+ BU_LIST_DEQUEUE(&ps->l);
+
+ if (rt_pipe_ck(&head->l)) {
+ bu_log("Cannot delete this point, it will result in an illegal pipe\n");
+ if (next) {
+ BU_LIST_INSERT(&next->l, &ps->l);
+ } else if (prev) {
+ BU_LIST_APPEND(&prev->l, &ps->l);
+ } else {
+ BU_LIST_INSERT(&head->l, &ps->l);
+ }
+
+ return ps;
+ } else {
+ BU_PUT(ps, struct wdb_pipe_pnt);
+ }
+
+ if (prev)
+ return prev;
+ else
+ return next;
+
+}
+
+
+int
+_ged_pipe_move_pnt(struct rt_pipe_internal *pipeip, struct wdb_pipe_pnt *ps,
const point_t new_pt)
+{
+ point_t old_pt;
+
+ RT_PIPE_CK_MAGIC(pipeip);
+ BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe segment");
+
+ VMOVE(old_pt, ps->pp_coord);
+
+ VMOVE(ps->pp_coord, new_pt);
+ if (rt_pipe_ck(&pipeip->pipe_segs_head)) {
+ bu_log("Cannot move point there\n");
+ VMOVE(ps->pp_coord, old_pt);
+ return 1;
+ }
+
+ return 0;
+}
+
+
+int
+_ged_scale_pipe(struct ged *gedp, struct rt_pipe_internal *pipeip, const char
*attribute, fastf_t sf, int rflag)
+{
+ int seg_i;
+ struct wdb_pipe_pnt *ps;
+
+ RT_PIPE_CK_MAGIC(pipeip);
+
+ /* encode rflag as a negative scale so we don't have to pass it */
+ if (!rflag && sf > 0)
+ sf = -sf;
+
+ switch (attribute[0]) {
+ case 'b':
+ case 'r':
+ if (sscanf(attribute+1, "%d", &seg_i) != 1)
+ seg_i = 0;
+
+ if ((ps = _ged_get_pipe_seg_i(pipeip, seg_i)) == (struct
wdb_pipe_pnt *)NULL)
+ return GED_ERROR;
+
+ pipe_seg_scale_radius(ps, sf);
+ break;
+ case 'B':
+ case 'R':
+ pipe_scale_radius(pipeip, sf);
+ break;
+ case 'i':
+ if (sscanf(attribute+1, "%d", &seg_i) != 1)
+ seg_i = 0;
+
+ if ((ps = _ged_get_pipe_seg_i(pipeip, seg_i)) == (struct
wdb_pipe_pnt *)NULL)
+ return GED_ERROR;
+
+ pipe_seg_scale_id(ps, sf);
+ break;
+ case 'I':
+ pipe_scale_id(pipeip, sf);
+ break;
+ case 'o':
+ if (sscanf(attribute+1, "%d", &seg_i) != 1)
+ seg_i = 0;
+
+ if ((ps = _ged_get_pipe_seg_i(pipeip, seg_i)) == (struct
wdb_pipe_pnt *)NULL)
+ return GED_ERROR;
+
+ pipe_seg_scale_od(ps, sf);
+ break;
+ case 'O':
+ pipe_scale_od(pipeip, sf);
+ break;
+ default:
+ bu_vls_printf(gedp->ged_result_str, "bad pipe attribute - %s",
attribute);
+ return GED_ERROR;
+ }
+
+ return GED_OK;
+}
+
+
+int
+_ged_pipe_append_pnt_common(struct ged *gedp, int argc, const char *argv[],
struct wdb_pipe_pnt *(*func)(struct rt_pipe_internal *, struct wdb_pipe_pnt *,
const point_t))
+{
+ struct directory *dp;
+ static const char *usage = "pipe pt";
+ struct rt_db_internal intern;
+ struct rt_pipe_internal *pipeip;
+ mat_t mat;
+ point_t view_ps_pt;
+ point_t view_pp_coord;
+ point_t ps_pt;
+ struct wdb_pipe_pnt *prevpp;
+ double scan[3];
+ char *last;
+
+ GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
+ GED_CHECK_VIEW(gedp, GED_ERROR);
+ GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
+
+ /* initialize result */
+ bu_vls_trunc(gedp->ged_result_str, 0);
+
+ /* must be wanting help */
+ if (argc == 1) {
+ bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+ return GED_HELP;
+ }
+
+ if (argc != 3) {
+ bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+ return GED_ERROR;
+ }
+
+ if ((last = strrchr(argv[1], '/')) == NULL)
+ last = (char *)argv[1];
+ else
+ ++last;
+
+ if (last[0] == '\0') {
+ bu_vls_printf(gedp->ged_result_str, "%s: illegal input - %s", argv[0],
argv[1]);
+ return GED_ERROR;
+ }
+
+ dp = db_lookup(gedp->ged_wdbp->dbip, last, LOOKUP_QUIET);
+ if (dp == RT_DIR_NULL) {
+ bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0],
argv[1]);
+ return GED_ERROR;
+ }
+
+ if (sscanf(argv[2], "%lf %lf %lf", &scan[X], &scan[Y], &scan[Z]) != 3) {
+ bu_vls_printf(gedp->ged_result_str, "%s: bad point - %s", argv[0],
argv[2]);
+ return GED_ERROR;
+ }
+ /* convert from double to fastf_t */
+ VMOVE(view_ps_pt, scan);
+
+ if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1],
gedp->ged_wdbp, mat) == GED_ERROR)
+ return GED_ERROR;
+
+ if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD ||
+ intern.idb_minor_type != DB5_MINORTYPE_BRLCAD_PIPE) {
+ bu_vls_printf(gedp->ged_result_str, "Object not a PIPE");
+ rt_db_free_internal(&intern);
+
+ return GED_ERROR;
+ }
+
+ pipeip = (struct rt_pipe_internal *)intern.idb_ptr;
+
+ /* use the view z from the first or last pipe point, depending on whether
we're appending or prepending */
+ if (func == _ged_pipe_add_pnt)
+ prevpp = BU_LIST_LAST(wdb_pipe_pnt, &pipeip->pipe_segs_head);
+ else
+ prevpp = BU_LIST_FIRST(wdb_pipe_pnt, &pipeip->pipe_segs_head);
+
+ MAT4X3PNT(view_pp_coord, gedp->ged_gvp->gv_model2view, prevpp->pp_coord);
+ view_ps_pt[Z] = view_pp_coord[Z];
+ MAT4X3PNT(ps_pt, gedp->ged_gvp->gv_view2model, view_ps_pt);
+
+ if ((*func)(pipeip, (struct wdb_pipe_pnt *)NULL, ps_pt) == (struct
wdb_pipe_pnt *)NULL) {
+ rt_db_free_internal(&intern);
+ bu_vls_printf(gedp->ged_result_str, "%s: cannot move point there",
argv[0]);
+ return GED_ERROR;
+ }
+
+ {
+ mat_t invmat;
+ struct wdb_pipe_pnt *curr_ps;
+ point_t curr_pt;
+
+ bn_mat_inv(invmat, mat);
+ for (BU_LIST_FOR(curr_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) {
+ MAT4X3PNT(curr_pt, invmat, curr_ps->pp_coord);
+ VMOVE(curr_ps->pp_coord, curr_pt);
+ }
+
+ GED_DB_PUT_INTERNAL(gedp, dp, &intern, &rt_uniresource, GED_ERROR);
+ }
+
+ rt_db_free_internal(&intern);
+ return GED_OK;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */
Property changes on: brlcad/branches/gedplugins/src/libged/pipe.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
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