Revision: 76398
http://sourceforge.net/p/brlcad/code/76398
Author: starseeker
Date: 2020-07-21 19:33:32 +0000 (Tue, 21 Jul 2020)
Log Message:
-----------
relocate wdb_importFg4Section.c
Modified Paths:
--------------
brlcad/branches/gedplugins/src/libged/CMakeLists.txt
Added Paths:
-----------
brlcad/branches/gedplugins/src/libged/importFg4Section/wdb_importFg4Section.c
Removed Paths:
-------------
brlcad/branches/gedplugins/src/libged/wdb_importFg4Section.c
Modified: brlcad/branches/gedplugins/src/libged/CMakeLists.txt
===================================================================
--- brlcad/branches/gedplugins/src/libged/CMakeLists.txt 2020-07-21
19:14:28 UTC (rev 76397)
+++ brlcad/branches/gedplugins/src/libged/CMakeLists.txt 2020-07-21
19:33:32 UTC (rev 76398)
@@ -73,7 +73,6 @@
translate_extrude.c
translate_tgc.c
vutil.c
- wdb_importFg4Section.c
3ptarb/3ptarb.c
adc/adc.c
@@ -196,6 +195,7 @@
human/human.c
illum/illum.c
importFg4Section/importFg4Section.c
+ importFg4Section/wdb_importFg4Section.c
inside/inside.c
instance/instance.c
isize/isize.c
Copied:
brlcad/branches/gedplugins/src/libged/importFg4Section/wdb_importFg4Section.c
(from rev 76397, brlcad/branches/gedplugins/src/libged/wdb_importFg4Section.c)
===================================================================
---
brlcad/branches/gedplugins/src/libged/importFg4Section/wdb_importFg4Section.c
(rev 0)
+++
brlcad/branches/gedplugins/src/libged/importFg4Section/wdb_importFg4Section.c
2020-07-21 19:33:32 UTC (rev 76398)
@@ -0,0 +1,554 @@
+/* I M P O R T F G 4 S E C T I O N . C
+ * BRL-CAD
+ *
+ * Copyright (c) 1994-2020 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * This library 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 library 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.
+ */
+/** @addtogroup librt */
+/** @{ */
+/** @file libged/importFg4Section.c
+ *
+ * Some of this code was taken from conv/fast4-g.c and libwdb/bot.c
+ * and modified to behave as a method of the BRL-CAD database object
+ * that imports a Fastgen4 section from a string. This section can
+ * only contain GRIDs, CTRIs and CQUADs.
+ *
+ */
+
+#include "common.h"
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "bu/debug.h"
+#include "bu/str.h"
+#include "rt/db4.h"
+#include "vmath.h"
+#include "nmg.h"
+#include "rt/geom.h"
+#include "raytrace.h"
+#include "ged.h"
+#include "wdb.h"
+#include "bn/plot3.h"
+
+
+static int grid_size; /* Number of points that will fit in current
grid_pts array */
+static int max_grid_no=0; /* Maximum grid number used */
+static int mode=0; /* Plate mode (1) or volume mode (2), of
current component */
+static int group_id=(-1); /* Group identification number from SECTION
card */
+static int comp_id=(-1); /* Component identification number from SECTION
card */
+static int region_id=0; /* Region id number (group id no X 1000
+ component id no) */
+static char field[9]; /* Space for storing one field from an input
line */
+static int bot=0; /* Flag: >0 -> There are BOT's in current
component */
+static int debug=0; /* Debug flag */
+
+static int *FACES=NULL; /* one triplet per face indexing three
grid points */
+static fastf_t *THICKNESS; /* thickness of each face */
+static char *facemode; /* mode for each face */
+static int face_size=0; /* actual length of above arrays */
+static int face_count=0; /* number of faces in above arrays */
+
+#define PLATE_MODE 1
+#define VOLUME_MODE 2
+
+#define POS_CENTER 1 /* face positions for facets */
+#define POS_FRONT 2
+
+#define END_OPEN 1 /* End closure codes for cones */
+#define END_CLOSED 2
+
+#define GRID_BLOCK 256 /* allocate space for grid points in blocks of 256
points */
+
+#define CLINE 'l'
+#define CHEX1 'p'
+#define CHEX2 'b'
+#define CTRI 't'
+#define CQUAD 'q'
+#define CCONE1 'c'
+#define CCONE2 'd'
+#define CCONE3 'e'
+#define CSPHERE 's'
+#define NMG 'n'
+#define BOT 't'
+#define COMPSPLT 'h'
+
+static point_t *grid_pts;
+
+
+/*************************** code from libwdb/bot.c
***************************/
+
+static int
+rt_mk_bot_w_normals(
+ struct rt_wdb *fp,
+ const char *name,
+ unsigned char botmode,
+ unsigned char orientation,
+ unsigned char flags,
+ int num_vertices,
+ int num_faces,
+ fastf_t *vertices, /* array of floats for vertices [num_vertices*3] */
+ int *faces, /* array of ints for faces [num_faces*3] */
+ fastf_t *thickness, /* array of plate mode thicknesses (corresponds
to array of faces)
+ * NULL for modes RT_BOT_SURFACE and RT_BOT_SOLID.
+ */
+ struct bu_bitv *face_mode, /* a flag for each face indicating thickness is
appended to hit point,
+ * otherwise thickness is centered about hit
point
+ */
+ int num_normals, /* number of unit normals in normals array */
+ fastf_t *normals, /* array of floats for normals [num_normals*3] */
+ int *face_normals) /* array of ints (indices into normals array), must
have 3*num_faces entries */
+{
+ struct rt_bot_internal *botip;
+ int i;
+
+ if ((num_normals > 0) && (db_version(fp->dbip) < 5)) {
+ bu_log("You are using an old database format which does not support
surface normals for BOT primitives\n");
+ bu_log("You are attempting to create a BOT primitive named \"%s\" with
surface normals\n" , name);
+ bu_log("The surface normals will not be saved\n");
+ bu_log("Please upgrade to the current database format by using
\"dbupgrade\"\n");
+ }
+
+ BU_ALLOC(botip, struct rt_bot_internal);
+ botip->magic = RT_BOT_INTERNAL_MAGIC;
+ botip->mode = botmode;
+ botip->orientation = orientation;
+ botip->bot_flags = flags;
+ botip->num_vertices = num_vertices;
+ botip->num_faces = num_faces;
+ botip->vertices = (fastf_t *)bu_calloc(num_vertices * 3, sizeof(fastf_t),
"botip->vertices");
+ for (i = 0; i < num_vertices*3; i++)
+ botip->vertices[i] = vertices[i];
+ botip->faces = (int *)bu_calloc(num_faces * 3, sizeof(int),
"botip->faces");
+ for (i = 0; i < num_faces * 3; i++)
+ botip->faces[i] = faces[i];
+ if (botmode == RT_BOT_PLATE) {
+ botip->thickness = (fastf_t *)bu_calloc(num_faces, sizeof(fastf_t),
"botip->thickness");
+ for (i = 0; i < num_faces; i++)
+ botip->thickness[i] = thickness[i];
+ botip->face_mode = bu_bitv_dup(face_mode);
+ } else {
+ botip->thickness = (fastf_t *)NULL;
+ botip->face_mode = (struct bu_bitv *)NULL;
+ }
+
+ if ((num_normals > 0) && (db_version(fp->dbip) > 4)) {
+ botip->num_normals = num_normals;
+ botip->num_face_normals = botip->num_faces;
+ botip->normals = (fastf_t *)bu_calloc(botip->num_normals * 3,
sizeof(fastf_t), "BOT normals");
+ botip->face_normals = (int *)bu_calloc(botip->num_faces * 3,
sizeof(int), "BOT face normals");
+ memcpy(botip->normals, normals, botip->num_normals * 3 *
sizeof(fastf_t));
+ memcpy(botip->face_normals, face_normals, botip->num_faces * 3 *
sizeof(int));
+ } else {
+ botip->bot_flags = 0;
+ botip->num_normals = 0;
+ botip->num_face_normals = 0;
+ botip->normals = (fastf_t *)NULL;
+ botip->face_normals = (int *)NULL;
+ }
+
+ return wdb_export(fp, name, (void *)botip, ID_BOT, 1.0);
+}
+
+
+static int
+rt_mk_bot(
+ struct rt_wdb *fp,
+ const char *name,
+ unsigned char botmode,
+ unsigned char orientation,
+ unsigned char flags,
+ int num_vertices,
+ int num_faces,
+ fastf_t *vertices, /* array of floats for vertices [num_vertices*3] */
+ int *faces, /* array of ints for faces [num_faces*3] */
+ fastf_t *thickness, /* array of plate mode thicknesses (corresponds
to array of faces)
+ * NULL for modes RT_BOT_SURFACE and RT_BOT_SOLID.
+ */
+ struct bu_bitv *face_mode) /* a flag for each face indicating thickness is
appended to hit point,
+ * otherwise thickness is centered about hit
point
+ */
+{
+ return (rt_mk_bot_w_normals(fp, name, botmode, orientation, flags,
num_vertices, num_faces, vertices,
+ faces, thickness, face_mode, 0, NULL, NULL));
+}
+
+
+/*************************** code from conv/fast4-g.c
***************************/
+
+void
+do_grid(char *line)
+{
+ int grid_no;
+ fastf_t x, y, z;
+
+ bu_strlcpy(field, &line[8], sizeof(field));
+ grid_no = atoi(field);
+
+ if (grid_no < 1) {
+ bu_log("ERROR: grid id number = %d\n", grid_no);
+ bu_bomb("BAD GRID ID NUMBER\n");
+ }
+
+ bu_strlcpy(field, &line[24], sizeof(field));
+ x = atof(field);
+
+ bu_strlcpy(field, &line[32], sizeof(field));
+ y = atof(field);
+
+ bu_strlcpy(field, &line[40], sizeof(field));
+ z = atof(field);
+
+ while (grid_no > grid_size - 1) {
+ grid_size += GRID_BLOCK;
+ grid_pts = (point_t *)bu_realloc((char *)grid_pts, grid_size *
sizeof(point_t), "fast4-g: grid_pts");
+ }
+
+ VSET(grid_pts[grid_no], x*25.4, y*25.4, z*25.4);
+
+ if (grid_no > max_grid_no)
+ max_grid_no = grid_no;
+}
+
+
+void
+Add_bot_face(int pt1, int pt2, int pt3, fastf_t thick, int pos)
+{
+
+ if (pt1 == pt2 || pt2 == pt3 || pt1 == pt3) {
+ bu_log("Add_bot_face: ignoring degenerate triangle in group %d
component %d\n", group_id, comp_id);
+ return;
+ }
+
+ if (pos == 0) /* use default */
+ pos = POS_FRONT;
+
+ if (mode == PLATE_MODE) {
+ if (pos != POS_CENTER && pos != POS_FRONT) {
+ bu_log("Add_bot_face: illegal position parameter (%d), must be one
or two (ignoring face for group %d component %d)\n", pos, group_id, comp_id);
+ return;
+ }
+ }
+
+ if (face_count >= face_size) {
+ face_size += GRID_BLOCK;
+ FACES = (int *)bu_realloc((void *)FACES, face_size*3*sizeof(int),
"faces");
+ THICKNESS = (fastf_t *)bu_realloc((void *)THICKNESS,
face_size*sizeof(fastf_t), "thickness");
+ facemode = (char *)bu_realloc((void *)facemode, face_size*sizeof(char),
"facemode");
+ }
+
+ FACES[face_count*3] = pt1;
+ FACES[face_count*3+1] = pt2;
+ FACES[face_count*3+2] = pt3;
+
+ if (mode == PLATE_MODE) {
+ THICKNESS[face_count] = thick;
+ facemode[face_count] = pos;
+ } else {
+ THICKNESS[face_count] = 0;
+ facemode[face_count] = 0;
+ }
+
+ face_count++;
+}
+
+
+void
+do_tri(char *line)
+{
+ int element_id;
+ int pt1, pt2, pt3;
+ fastf_t thick;
+ int pos;
+
+ if (debug)
+ bu_log("do_tri: %s\n", line);
+
+ bu_strlcpy(field, &line[8], sizeof(field));
+ element_id = atoi(field);
+
+ if (!bot)
+ bot = element_id;
+
+ if (FACES == NULL) {
+ FACES = (int *)bu_malloc(GRID_BLOCK*3*sizeof(int), "faces");
+ THICKNESS = (fastf_t *)bu_malloc(GRID_BLOCK*sizeof(fastf_t),
"thickness");
+ facemode = (char *)bu_malloc(GRID_BLOCK*sizeof(char), "facemode");
+ face_size = GRID_BLOCK;
+ face_count = 0;
+ }
+
+ bu_strlcpy(field, &line[24], sizeof(field));
+ pt1 = atoi(field);
+
+ bu_strlcpy(field, &line[32], sizeof(field));
+ pt2 = atoi(field);
+
+ bu_strlcpy(field, &line[40], sizeof(field));
+ pt3 = atoi(field);
+
+ thick = 0.0;
+ pos = 0;
+
+ if (mode == PLATE_MODE) {
+ bu_strlcpy(field, &line[56], sizeof(field));
+ thick = atof(field) * 25.4;
+
+ bu_strlcpy(field, &line[64], sizeof(field));
+ pos = atoi(field);
+ if (pos == 0)
+ pos = POS_FRONT;
+
+ if (debug)
+ bu_log("\tplate mode: thickness = %f\n", thick);
+
+ }
+
+ Add_bot_face(pt1, pt2, pt3, thick, pos);
+}
+
+
+void
+do_quad(const char *line)
+{
+ int element_id;
+ int pt1, pt2, pt3, pt4;
+ fastf_t thick = 0.0;
+ int pos = 0;
+
+ bu_strlcpy(field, &line[8], sizeof(field));
+ element_id = atoi(field);
+
+ if (debug)
+ bu_log("do_quad: %s\n", line);
+
+ if (!bot)
+ bot = element_id;
+
+ if (FACES == NULL) {
+ FACES = (int *)bu_malloc(GRID_BLOCK*3*sizeof(int), "faces");
+ THICKNESS = (fastf_t *)bu_malloc(GRID_BLOCK*sizeof(fastf_t),
"thickness");
+ facemode = (char *)bu_malloc(GRID_BLOCK*sizeof(char), "facemode");
+ face_size = GRID_BLOCK;
+ face_count = 0;
+ }
+
+ bu_strlcpy(field, &line[24], sizeof(field));
+ pt1 = atoi(field);
+
+ bu_strlcpy(field, &line[32], sizeof(field));
+ pt2 = atoi(field);
+
+ bu_strlcpy(field, &line[40], sizeof(field));
+ pt3 = atoi(field);
+
+ bu_strlcpy(field, &line[48], sizeof(field));
+ pt4 = atoi(field);
+
+ if (mode == PLATE_MODE) {
+ bu_strlcpy(field, &line[56], sizeof(field));
+ thick = atof(field) * 25.4;
+
+ bu_strlcpy(field, &line[64], sizeof(field));
+ pos = atoi(field);
+
+ if (pos == 0) /* use default */
+ pos = POS_FRONT;
+
+ if (pos != POS_CENTER && pos != POS_FRONT) {
+ bu_log("do_quad: illegal position parameter (%d), must be one or
two\n", pos);
+ bu_log("\telement %d, component %d, group %d\n", element_id,
comp_id, group_id);
+ return;
+ }
+ }
+
+ Add_bot_face(pt1, pt2, pt3, thick, pos);
+ Add_bot_face(pt1, pt3, pt4, thick, pos);
+}
+
+
+void
+make_bot_object(const char *name,
+ struct rt_wdb *wdbp)
+{
+ int i;
+ int max_pt=0, min_pt=999999;
+ int num_vertices;
+ struct bu_bitv *bv=NULL;
+ int bot_mode;
+ int count;
+ struct rt_bot_internal bot_ip;
+
+ bot_ip.magic = RT_BOT_INTERNAL_MAGIC;
+ for (i = 0; i < face_count; i++) {
+ V_MIN(min_pt, FACES[i*3]);
+ V_MAX(max_pt, FACES[i*3]);
+ V_MIN(min_pt, FACES[i*3+1]);
+ V_MAX(max_pt, FACES[i*3+1]);
+ V_MIN(min_pt, FACES[i*3+2]);
+ V_MAX(max_pt, FACES[i*3+2]);
+ }
+
+ num_vertices = max_pt - min_pt + 1;
+ bot_ip.num_vertices = num_vertices;
+ bot_ip.vertices = (fastf_t *)bu_calloc(num_vertices*3, sizeof(fastf_t),
"BOT vertices");
+ for (i = 0; i < num_vertices; i++)
+ VMOVE(&bot_ip.vertices[i*3], grid_pts[min_pt+i]);
+
+ for (i = 0; i < face_count*3; i++)
+ FACES[i] -= min_pt;
+ bot_ip.num_faces = face_count;
+ bot_ip.faces = (int *)bu_calloc(face_count*3, sizeof(int), "BOT faces");
+ for (i = 0; i < face_count*3; i++)
+ bot_ip.faces[i] = FACES[i];
+
+ bot_ip.face_mode = (struct bu_bitv *)NULL;
+ bot_ip.thickness = (fastf_t *)NULL;
+ if (mode == PLATE_MODE) {
+ bot_mode = RT_BOT_PLATE;
+ bv = bu_bitv_new(face_count);
+ for (i = 0; i < face_count; i++) {
+ if (facemode[i] == POS_FRONT)
+ BU_BITSET(bv, i);
+ }
+ bot_ip.face_mode = bv;
+ bot_ip.thickness = (fastf_t *)bu_calloc(face_count, sizeof(fastf_t),
"BOT thickness");
+ for (i = 0; i < face_count; i++)
+ bot_ip.thickness[i] = THICKNESS[i];
+ } else
+ bot_mode = RT_BOT_SOLID;
+
+ bot_ip.mode = bot_mode;
+ bot_ip.orientation = RT_BOT_UNORIENTED;
+ bot_ip.bot_flags = 0;
+
+ count = rt_bot_vertex_fuse(&bot_ip, &wdbp->wdb_tol);
+ count = rt_bot_face_fuse(&bot_ip);
+ if (count)
+ bu_log("WARNING: %d duplicate faces eliminated from group %d component
%d\n", count, group_id, comp_id);
+
+ rt_mk_bot(wdbp, name, bot_mode, RT_BOT_UNORIENTED, 0,
+ bot_ip.num_vertices, bot_ip.num_faces, bot_ip.vertices,
+ bot_ip.faces, bot_ip.thickness, bot_ip.face_mode);
+
+ if (mode == PLATE_MODE) {
+ bu_free((char *)bot_ip.thickness, "BOT thickness");
+ bu_free((char *)bot_ip.face_mode, "BOT face_mode");
+ }
+ bu_free((char *)bot_ip.vertices, "BOT vertices");
+ bu_free((char *)bot_ip.faces, "BOT faces");
+}
+
+
+/*************************** Start of new code. ***************************/
+
+#define FIND_NEWLINE(_cp, _eosFlag) \
+ while (*(_cp) != '\0' && \
+ *(_cp) != '\n') \
+ ++(_cp); \
+ \
+ if (*(_cp) == '\0') \
+ _eosFlag = 1; \
+ else \
+ *(_cp) = '\0';
+
+int
+wdb_importFg4Section_cmd(void *data,
+ int argc,
+ const char *argv[])
+{
+ struct rt_wdb *wdbp = (struct rt_wdb *)data;
+ char *cp;
+ char *line;
+ char *lines;
+ int eosFlag = 0;
+
+ if (argc != 3) {
+ bu_log("ERROR: expecting three arguments\n");
+ return GED_ERROR;
+ }
+
+ grid_size = GRID_BLOCK;
+ grid_pts = (point_t *)bu_malloc(grid_size * sizeof(point_t) ,
+ "importFg4Section: grid_pts");
+
+ lines = bu_strdup(argv[2]);
+ cp = line = lines;
+
+ FIND_NEWLINE(cp, eosFlag);
+
+ bu_strlcpy(field, line+8, sizeof(field));
+ group_id = atoi(field);
+
+ bu_strlcpy(field, line+16, sizeof(field));
+ comp_id = atoi(field);
+
+ region_id = group_id * 1000 + comp_id;
+
+ if (comp_id > 999) {
+ bu_log("Illegal component id number %d, changed to 999\n", comp_id);
+ comp_id = 999;
+ }
+
+ bu_strlcpy(field, line+24, sizeof(field));
+ mode = atoi(field);
+ if (mode != 1 && mode != 2) {
+ bu_log("Illegal mode (%d) for group %d component %d, using volume
mode\n",
+ mode, group_id, comp_id);
+ mode = 2;
+ }
+
+ while (!eosFlag) {
+ ++cp;
+ line = cp;
+ FIND_NEWLINE(cp, eosFlag);
+
+ if (!bu_strncmp(line, "GRID", 4))
+ do_grid(line);
+ else if (!bu_strncmp(line, "CTRI", 4))
+ do_tri(line);
+ else if (!bu_strncmp(line, "CQUAD", 4))
+ do_quad(line);
+ }
+
+ make_bot_object(argv[1], wdbp);
+ free((void *)lines);
+ bu_free((void *)grid_pts, "importFg4Section: grid_pts");
+
+ /* free memory associated with globals */
+ bu_free((void *)FACES, "importFg4Section: faces");
+ bu_free((void *)THICKNESS, "importFg4Section: thickness");
+ bu_free((void *)facemode, "importFg4Section: facemode");
+
+ FACES = NULL;
+ THICKNESS = NULL;
+ facemode = NULL;
+
+ return GED_OK;
+}
+/** @} */
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */
Deleted: brlcad/branches/gedplugins/src/libged/wdb_importFg4Section.c
===================================================================
--- brlcad/branches/gedplugins/src/libged/wdb_importFg4Section.c
2020-07-21 19:14:28 UTC (rev 76397)
+++ brlcad/branches/gedplugins/src/libged/wdb_importFg4Section.c
2020-07-21 19:33:32 UTC (rev 76398)
@@ -1,554 +0,0 @@
-/* I M P O R T F G 4 S E C T I O N . C
- * BRL-CAD
- *
- * Copyright (c) 1994-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This library 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 library 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.
- */
-/** @addtogroup librt */
-/** @{ */
-/** @file libged/importFg4Section.c
- *
- * Some of this code was taken from conv/fast4-g.c and libwdb/bot.c
- * and modified to behave as a method of the BRL-CAD database object
- * that imports a Fastgen4 section from a string. This section can
- * only contain GRIDs, CTRIs and CQUADs.
- *
- */
-
-#include "common.h"
-
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-
-#include "bu/debug.h"
-#include "bu/str.h"
-#include "rt/db4.h"
-#include "vmath.h"
-#include "nmg.h"
-#include "rt/geom.h"
-#include "raytrace.h"
-#include "ged.h"
-#include "wdb.h"
-#include "bn/plot3.h"
-
-
-static int grid_size; /* Number of points that will fit in current
grid_pts array */
-static int max_grid_no=0; /* Maximum grid number used */
-static int mode=0; /* Plate mode (1) or volume mode (2), of
current component */
-static int group_id=(-1); /* Group identification number from SECTION
card */
-static int comp_id=(-1); /* Component identification number from SECTION
card */
-static int region_id=0; /* Region id number (group id no X 1000
+ component id no) */
-static char field[9]; /* Space for storing one field from an input
line */
-static int bot=0; /* Flag: >0 -> There are BOT's in current
component */
-static int debug=0; /* Debug flag */
-
-static int *FACES=NULL; /* one triplet per face indexing three
grid points */
-static fastf_t *THICKNESS; /* thickness of each face */
-static char *facemode; /* mode for each face */
-static int face_size=0; /* actual length of above arrays */
-static int face_count=0; /* number of faces in above arrays */
-
-#define PLATE_MODE 1
-#define VOLUME_MODE 2
-
-#define POS_CENTER 1 /* face positions for facets */
-#define POS_FRONT 2
-
-#define END_OPEN 1 /* End closure codes for cones */
-#define END_CLOSED 2
-
-#define GRID_BLOCK 256 /* allocate space for grid points in blocks of 256
points */
-
-#define CLINE 'l'
-#define CHEX1 'p'
-#define CHEX2 'b'
-#define CTRI 't'
-#define CQUAD 'q'
-#define CCONE1 'c'
-#define CCONE2 'd'
-#define CCONE3 'e'
-#define CSPHERE 's'
-#define NMG 'n'
-#define BOT 't'
-#define COMPSPLT 'h'
-
-static point_t *grid_pts;
-
-
-/*************************** code from libwdb/bot.c
***************************/
-
-static int
-rt_mk_bot_w_normals(
- struct rt_wdb *fp,
- const char *name,
- unsigned char botmode,
- unsigned char orientation,
- unsigned char flags,
- int num_vertices,
- int num_faces,
- fastf_t *vertices, /* array of floats for vertices [num_vertices*3] */
- int *faces, /* array of ints for faces [num_faces*3] */
- fastf_t *thickness, /* array of plate mode thicknesses (corresponds
to array of faces)
- * NULL for modes RT_BOT_SURFACE and RT_BOT_SOLID.
- */
- struct bu_bitv *face_mode, /* a flag for each face indicating thickness is
appended to hit point,
- * otherwise thickness is centered about hit
point
- */
- int num_normals, /* number of unit normals in normals array */
- fastf_t *normals, /* array of floats for normals [num_normals*3] */
- int *face_normals) /* array of ints (indices into normals array), must
have 3*num_faces entries */
-{
- struct rt_bot_internal *botip;
- int i;
-
- if ((num_normals > 0) && (db_version(fp->dbip) < 5)) {
- bu_log("You are using an old database format which does not support
surface normals for BOT primitives\n");
- bu_log("You are attempting to create a BOT primitive named \"%s\" with
surface normals\n" , name);
- bu_log("The surface normals will not be saved\n");
- bu_log("Please upgrade to the current database format by using
\"dbupgrade\"\n");
- }
-
- BU_ALLOC(botip, struct rt_bot_internal);
- botip->magic = RT_BOT_INTERNAL_MAGIC;
- botip->mode = botmode;
- botip->orientation = orientation;
- botip->bot_flags = flags;
- botip->num_vertices = num_vertices;
- botip->num_faces = num_faces;
- botip->vertices = (fastf_t *)bu_calloc(num_vertices * 3, sizeof(fastf_t),
"botip->vertices");
- for (i = 0; i < num_vertices*3; i++)
- botip->vertices[i] = vertices[i];
- botip->faces = (int *)bu_calloc(num_faces * 3, sizeof(int),
"botip->faces");
- for (i = 0; i < num_faces * 3; i++)
- botip->faces[i] = faces[i];
- if (botmode == RT_BOT_PLATE) {
- botip->thickness = (fastf_t *)bu_calloc(num_faces, sizeof(fastf_t),
"botip->thickness");
- for (i = 0; i < num_faces; i++)
- botip->thickness[i] = thickness[i];
- botip->face_mode = bu_bitv_dup(face_mode);
- } else {
- botip->thickness = (fastf_t *)NULL;
- botip->face_mode = (struct bu_bitv *)NULL;
- }
-
- if ((num_normals > 0) && (db_version(fp->dbip) > 4)) {
- botip->num_normals = num_normals;
- botip->num_face_normals = botip->num_faces;
- botip->normals = (fastf_t *)bu_calloc(botip->num_normals * 3,
sizeof(fastf_t), "BOT normals");
- botip->face_normals = (int *)bu_calloc(botip->num_faces * 3,
sizeof(int), "BOT face normals");
- memcpy(botip->normals, normals, botip->num_normals * 3 *
sizeof(fastf_t));
- memcpy(botip->face_normals, face_normals, botip->num_faces * 3 *
sizeof(int));
- } else {
- botip->bot_flags = 0;
- botip->num_normals = 0;
- botip->num_face_normals = 0;
- botip->normals = (fastf_t *)NULL;
- botip->face_normals = (int *)NULL;
- }
-
- return wdb_export(fp, name, (void *)botip, ID_BOT, 1.0);
-}
-
-
-static int
-rt_mk_bot(
- struct rt_wdb *fp,
- const char *name,
- unsigned char botmode,
- unsigned char orientation,
- unsigned char flags,
- int num_vertices,
- int num_faces,
- fastf_t *vertices, /* array of floats for vertices [num_vertices*3] */
- int *faces, /* array of ints for faces [num_faces*3] */
- fastf_t *thickness, /* array of plate mode thicknesses (corresponds
to array of faces)
- * NULL for modes RT_BOT_SURFACE and RT_BOT_SOLID.
- */
- struct bu_bitv *face_mode) /* a flag for each face indicating thickness is
appended to hit point,
- * otherwise thickness is centered about hit
point
- */
-{
- return (rt_mk_bot_w_normals(fp, name, botmode, orientation, flags,
num_vertices, num_faces, vertices,
- faces, thickness, face_mode, 0, NULL, NULL));
-}
-
-
-/*************************** code from conv/fast4-g.c
***************************/
-
-void
-do_grid(char *line)
-{
- int grid_no;
- fastf_t x, y, z;
-
- bu_strlcpy(field, &line[8], sizeof(field));
- grid_no = atoi(field);
-
- if (grid_no < 1) {
- bu_log("ERROR: grid id number = %d\n", grid_no);
- bu_bomb("BAD GRID ID NUMBER\n");
- }
-
- bu_strlcpy(field, &line[24], sizeof(field));
- x = atof(field);
-
- bu_strlcpy(field, &line[32], sizeof(field));
- y = atof(field);
-
- bu_strlcpy(field, &line[40], sizeof(field));
- z = atof(field);
-
- while (grid_no > grid_size - 1) {
- grid_size += GRID_BLOCK;
- grid_pts = (point_t *)bu_realloc((char *)grid_pts, grid_size *
sizeof(point_t), "fast4-g: grid_pts");
- }
-
- VSET(grid_pts[grid_no], x*25.4, y*25.4, z*25.4);
-
- if (grid_no > max_grid_no)
- max_grid_no = grid_no;
-}
-
-
-void
-Add_bot_face(int pt1, int pt2, int pt3, fastf_t thick, int pos)
-{
-
- if (pt1 == pt2 || pt2 == pt3 || pt1 == pt3) {
- bu_log("Add_bot_face: ignoring degenerate triangle in group %d
component %d\n", group_id, comp_id);
- return;
- }
-
- if (pos == 0) /* use default */
- pos = POS_FRONT;
-
- if (mode == PLATE_MODE) {
- if (pos != POS_CENTER && pos != POS_FRONT) {
- bu_log("Add_bot_face: illegal position parameter (%d), must be one
or two (ignoring face for group %d component %d)\n", pos, group_id, comp_id);
- return;
- }
- }
-
- if (face_count >= face_size) {
- face_size += GRID_BLOCK;
- FACES = (int *)bu_realloc((void *)FACES, face_size*3*sizeof(int),
"faces");
- THICKNESS = (fastf_t *)bu_realloc((void *)THICKNESS,
face_size*sizeof(fastf_t), "thickness");
- facemode = (char *)bu_realloc((void *)facemode, face_size*sizeof(char),
"facemode");
- }
-
- FACES[face_count*3] = pt1;
- FACES[face_count*3+1] = pt2;
- FACES[face_count*3+2] = pt3;
-
- if (mode == PLATE_MODE) {
- THICKNESS[face_count] = thick;
- facemode[face_count] = pos;
- } else {
- THICKNESS[face_count] = 0;
- facemode[face_count] = 0;
- }
-
- face_count++;
-}
-
-
-void
-do_tri(char *line)
-{
- int element_id;
- int pt1, pt2, pt3;
- fastf_t thick;
- int pos;
-
- if (debug)
- bu_log("do_tri: %s\n", line);
-
- bu_strlcpy(field, &line[8], sizeof(field));
- element_id = atoi(field);
-
- if (!bot)
- bot = element_id;
-
- if (FACES == NULL) {
- FACES = (int *)bu_malloc(GRID_BLOCK*3*sizeof(int), "faces");
- THICKNESS = (fastf_t *)bu_malloc(GRID_BLOCK*sizeof(fastf_t),
"thickness");
- facemode = (char *)bu_malloc(GRID_BLOCK*sizeof(char), "facemode");
- face_size = GRID_BLOCK;
- face_count = 0;
- }
-
- bu_strlcpy(field, &line[24], sizeof(field));
- pt1 = atoi(field);
-
- bu_strlcpy(field, &line[32], sizeof(field));
- pt2 = atoi(field);
-
- bu_strlcpy(field, &line[40], sizeof(field));
- pt3 = atoi(field);
-
- thick = 0.0;
- pos = 0;
-
- if (mode == PLATE_MODE) {
- bu_strlcpy(field, &line[56], sizeof(field));
- thick = atof(field) * 25.4;
-
- bu_strlcpy(field, &line[64], sizeof(field));
- pos = atoi(field);
- if (pos == 0)
- pos = POS_FRONT;
-
- if (debug)
- bu_log("\tplate mode: thickness = %f\n", thick);
-
- }
-
- Add_bot_face(pt1, pt2, pt3, thick, pos);
-}
-
-
-void
-do_quad(const char *line)
-{
- int element_id;
- int pt1, pt2, pt3, pt4;
- fastf_t thick = 0.0;
- int pos = 0;
-
- bu_strlcpy(field, &line[8], sizeof(field));
- element_id = atoi(field);
-
- if (debug)
- bu_log("do_quad: %s\n", line);
-
- if (!bot)
- bot = element_id;
-
- if (FACES == NULL) {
- FACES = (int *)bu_malloc(GRID_BLOCK*3*sizeof(int), "faces");
- THICKNESS = (fastf_t *)bu_malloc(GRID_BLOCK*sizeof(fastf_t),
"thickness");
- facemode = (char *)bu_malloc(GRID_BLOCK*sizeof(char), "facemode");
- face_size = GRID_BLOCK;
- face_count = 0;
- }
-
- bu_strlcpy(field, &line[24], sizeof(field));
- pt1 = atoi(field);
-
- bu_strlcpy(field, &line[32], sizeof(field));
- pt2 = atoi(field);
-
- bu_strlcpy(field, &line[40], sizeof(field));
- pt3 = atoi(field);
-
- bu_strlcpy(field, &line[48], sizeof(field));
- pt4 = atoi(field);
-
- if (mode == PLATE_MODE) {
- bu_strlcpy(field, &line[56], sizeof(field));
- thick = atof(field) * 25.4;
-
- bu_strlcpy(field, &line[64], sizeof(field));
- pos = atoi(field);
-
- if (pos == 0) /* use default */
- pos = POS_FRONT;
-
- if (pos != POS_CENTER && pos != POS_FRONT) {
- bu_log("do_quad: illegal position parameter (%d), must be one or
two\n", pos);
- bu_log("\telement %d, component %d, group %d\n", element_id,
comp_id, group_id);
- return;
- }
- }
-
- Add_bot_face(pt1, pt2, pt3, thick, pos);
- Add_bot_face(pt1, pt3, pt4, thick, pos);
-}
-
-
-void
-make_bot_object(const char *name,
- struct rt_wdb *wdbp)
-{
- int i;
- int max_pt=0, min_pt=999999;
- int num_vertices;
- struct bu_bitv *bv=NULL;
- int bot_mode;
- int count;
- struct rt_bot_internal bot_ip;
-
- bot_ip.magic = RT_BOT_INTERNAL_MAGIC;
- for (i = 0; i < face_count; i++) {
- V_MIN(min_pt, FACES[i*3]);
- V_MAX(max_pt, FACES[i*3]);
- V_MIN(min_pt, FACES[i*3+1]);
- V_MAX(max_pt, FACES[i*3+1]);
- V_MIN(min_pt, FACES[i*3+2]);
- V_MAX(max_pt, FACES[i*3+2]);
- }
-
- num_vertices = max_pt - min_pt + 1;
- bot_ip.num_vertices = num_vertices;
- bot_ip.vertices = (fastf_t *)bu_calloc(num_vertices*3, sizeof(fastf_t),
"BOT vertices");
- for (i = 0; i < num_vertices; i++)
- VMOVE(&bot_ip.vertices[i*3], grid_pts[min_pt+i]);
-
- for (i = 0; i < face_count*3; i++)
- FACES[i] -= min_pt;
- bot_ip.num_faces = face_count;
- bot_ip.faces = (int *)bu_calloc(face_count*3, sizeof(int), "BOT faces");
- for (i = 0; i < face_count*3; i++)
- bot_ip.faces[i] = FACES[i];
-
- bot_ip.face_mode = (struct bu_bitv *)NULL;
- bot_ip.thickness = (fastf_t *)NULL;
- if (mode == PLATE_MODE) {
- bot_mode = RT_BOT_PLATE;
- bv = bu_bitv_new(face_count);
- for (i = 0; i < face_count; i++) {
- if (facemode[i] == POS_FRONT)
- BU_BITSET(bv, i);
- }
- bot_ip.face_mode = bv;
- bot_ip.thickness = (fastf_t *)bu_calloc(face_count, sizeof(fastf_t),
"BOT thickness");
- for (i = 0; i < face_count; i++)
- bot_ip.thickness[i] = THICKNESS[i];
- } else
- bot_mode = RT_BOT_SOLID;
-
- bot_ip.mode = bot_mode;
- bot_ip.orientation = RT_BOT_UNORIENTED;
- bot_ip.bot_flags = 0;
-
- count = rt_bot_vertex_fuse(&bot_ip, &wdbp->wdb_tol);
- count = rt_bot_face_fuse(&bot_ip);
- if (count)
- bu_log("WARNING: %d duplicate faces eliminated from group %d component
%d\n", count, group_id, comp_id);
-
- rt_mk_bot(wdbp, name, bot_mode, RT_BOT_UNORIENTED, 0,
- bot_ip.num_vertices, bot_ip.num_faces, bot_ip.vertices,
- bot_ip.faces, bot_ip.thickness, bot_ip.face_mode);
-
- if (mode == PLATE_MODE) {
- bu_free((char *)bot_ip.thickness, "BOT thickness");
- bu_free((char *)bot_ip.face_mode, "BOT face_mode");
- }
- bu_free((char *)bot_ip.vertices, "BOT vertices");
- bu_free((char *)bot_ip.faces, "BOT faces");
-}
-
-
-/*************************** Start of new code. ***************************/
-
-#define FIND_NEWLINE(_cp, _eosFlag) \
- while (*(_cp) != '\0' && \
- *(_cp) != '\n') \
- ++(_cp); \
- \
- if (*(_cp) == '\0') \
- _eosFlag = 1; \
- else \
- *(_cp) = '\0';
-
-int
-wdb_importFg4Section_cmd(void *data,
- int argc,
- const char *argv[])
-{
- struct rt_wdb *wdbp = (struct rt_wdb *)data;
- char *cp;
- char *line;
- char *lines;
- int eosFlag = 0;
-
- if (argc != 3) {
- bu_log("ERROR: expecting three arguments\n");
- return GED_ERROR;
- }
-
- grid_size = GRID_BLOCK;
- grid_pts = (point_t *)bu_malloc(grid_size * sizeof(point_t) ,
- "importFg4Section: grid_pts");
-
- lines = bu_strdup(argv[2]);
- cp = line = lines;
-
- FIND_NEWLINE(cp, eosFlag);
-
- bu_strlcpy(field, line+8, sizeof(field));
- group_id = atoi(field);
-
- bu_strlcpy(field, line+16, sizeof(field));
- comp_id = atoi(field);
-
- region_id = group_id * 1000 + comp_id;
-
- if (comp_id > 999) {
- bu_log("Illegal component id number %d, changed to 999\n", comp_id);
- comp_id = 999;
- }
-
- bu_strlcpy(field, line+24, sizeof(field));
- mode = atoi(field);
- if (mode != 1 && mode != 2) {
- bu_log("Illegal mode (%d) for group %d component %d, using volume
mode\n",
- mode, group_id, comp_id);
- mode = 2;
- }
-
- while (!eosFlag) {
- ++cp;
- line = cp;
- FIND_NEWLINE(cp, eosFlag);
-
- if (!bu_strncmp(line, "GRID", 4))
- do_grid(line);
- else if (!bu_strncmp(line, "CTRI", 4))
- do_tri(line);
- else if (!bu_strncmp(line, "CQUAD", 4))
- do_quad(line);
- }
-
- make_bot_object(argv[1], wdbp);
- free((void *)lines);
- bu_free((void *)grid_pts, "importFg4Section: grid_pts");
-
- /* free memory associated with globals */
- bu_free((void *)FACES, "importFg4Section: faces");
- bu_free((void *)THICKNESS, "importFg4Section: thickness");
- bu_free((void *)facemode, "importFg4Section: facemode");
-
- FACES = NULL;
- THICKNESS = NULL;
- facemode = NULL;
-
- return GED_OK;
-}
-/** @} */
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */
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