Revision: 57230
http://sourceforge.net/p/brlcad/code/57230
Author: starseeker
Date: 2013-08-28 18:58:26 +0000 (Wed, 28 Aug 2013)
Log Message:
-----------
Going to need a struct for parameters and info - start setting it up.
Modified Paths:
--------------
brlcad/trunk/src/conv/step/g-step/ON_Brep.cpp
brlcad/trunk/src/conv/step/g-step/ON_Brep.h
brlcad/trunk/src/conv/step/g-step/g-step.cpp
Modified: brlcad/trunk/src/conv/step/g-step/ON_Brep.cpp
===================================================================
--- brlcad/trunk/src/conv/step/g-step/ON_Brep.cpp 2013-08-28 18:57:04 UTC
(rev 57229)
+++ brlcad/trunk/src/conv/step/g-step/ON_Brep.cpp 2013-08-28 18:58:26 UTC
(rev 57230)
@@ -66,6 +66,7 @@
#include <sstream>
#include <map>
+#include "ON_Brep.h"
#include "STEPWrapper.h"
void
@@ -622,7 +623,7 @@
bool
-ON_BRep_to_STEP(ON_Brep *brep, Registry *registry, InstMgr *instance_list)
+ON_BRep_to_STEP(ON_Brep *brep, Exporter_Info_AP203 *info)
{
std::vector<STEPentity *> cartesian_pnts(brep->m_V.Count(), (STEPentity
*)0);
std::vector<STEPentity *> vertex_pnts(brep->m_V.Count(), (STEPentity *)0);
@@ -654,58 +655,58 @@
ON_Curve *right_side = NULL;
crv.Split(crv.Domain().Mid(), left_side, right_side);
// Left curve
- SdaiB_spline_curve_with_knots *left_curve =
(SdaiB_spline_curve_with_knots
*)registry->ObjCreate("B_SPLINE_CURVE_WITH_KNOTS");
+ SdaiB_spline_curve_with_knots *left_curve =
(SdaiB_spline_curve_with_knots
*)info->registry->ObjCreate("B_SPLINE_CURVE_WITH_KNOTS");
left_curve->degree_(left_side->Degree());
- ON_NurbsCurveCV_to_EntityAggregate((ON_NurbsCurve *)left_side,
left_curve, registry, instance_list);
+ ON_NurbsCurveCV_to_EntityAggregate((ON_NurbsCurve *)left_side,
left_curve, info->registry, info->instance_list);
ON_NurbsCurveKnots_to_Aggregates((ON_NurbsCurve *)left_side,
left_curve);
left_curve->curve_form_(B_spline_curve_form__unspecified);
left_curve->closed_curve_(LFalse);
left_curve->self_intersect_(LFalse);
left_curve->name_("''");
- instance_list->Append(left_curve, completeSE);
+ info->instance_list->Append(left_curve, completeSE);
// Right curve
- SdaiB_spline_curve_with_knots *right_curve =
(SdaiB_spline_curve_with_knots
*)registry->ObjCreate("B_SPLINE_CURVE_WITH_KNOTS");
+ SdaiB_spline_curve_with_knots *right_curve =
(SdaiB_spline_curve_with_knots
*)info->registry->ObjCreate("B_SPLINE_CURVE_WITH_KNOTS");
right_curve->degree_(right_side->Degree());
- ON_NurbsCurveCV_to_EntityAggregate((ON_NurbsCurve *)right_side,
right_curve, registry, instance_list);
+ ON_NurbsCurveCV_to_EntityAggregate((ON_NurbsCurve *)right_side,
right_curve, info->registry, info->instance_list);
ON_NurbsCurveKnots_to_Aggregates((ON_NurbsCurve *)right_side,
right_curve);
right_curve->curve_form_(B_spline_curve_form__unspecified);
right_curve->closed_curve_(LFalse);
right_curve->self_intersect_(LFalse);
right_curve->name_("''");
- instance_list->Append(right_curve, completeSE);
+ info->instance_list->Append(right_curve, completeSE);
sdai_curve_to_splits[i] = std::pair<STEPentity *, STEPentity
*>((STEPentity *)&(*left_curve), (STEPentity *)&(*right_curve));
// Midpoint vertex
- SdaiCartesian_point *pt = (SdaiCartesian_point
*)registry->ObjCreate("CARTESIAN_POINT");
- instance_list->Append(pt, completeSE);
+ SdaiCartesian_point *pt = (SdaiCartesian_point
*)info->registry->ObjCreate("CARTESIAN_POINT");
+ info->instance_list->Append(pt, completeSE);
pt->name_("''");
ON_3dPoint ONpnt = curve->PointAt(curve->Domain().Mid());
ON_3dPoint_to_Cartesian_point(&(ONpnt), pt);
- SdaiVertex_point *vpt = (SdaiVertex_point
*)registry->ObjCreate("VERTEX_POINT");
+ SdaiVertex_point *vpt = (SdaiVertex_point
*)info->registry->ObjCreate("VERTEX_POINT");
vpt->name_("''");
vpt->vertex_geometry_((const SdaiPoint_ptr)pt);
- instance_list->Append(vpt, completeSE);
+ info->instance_list->Append(vpt, completeSE);
split_midpt_vertex[i] = (STEPentity *)&(*vpt);
}
}
/* The BRep needs a context - TODO: this can probably be used once for the
whole step file... */
- STEPcomplex *context = Add_Default_Geometric_Context(registry,
instance_list);
+ STEPcomplex *context = Add_Default_Geometric_Context(info->registry,
info->instance_list);
// Set up vertices and associated cartesian points
for (int i = 0; i < brep->m_V.Count(); ++i) {
// Cartesian points (actual 3D geometry)
- cartesian_pnts.at(i) = registry->ObjCreate("CARTESIAN_POINT");
+ cartesian_pnts.at(i) = info->registry->ObjCreate("CARTESIAN_POINT");
((SdaiCartesian_point *)cartesian_pnts.at(i))->name_("''");
- instance_list->Append(cartesian_pnts.at(i), completeSE);
+ info->instance_list->Append(cartesian_pnts.at(i), completeSE);
ON_3dPoint v_pnt = brep->m_V[i].Point();
ON_3dPoint_to_Cartesian_point(&(v_pnt), (SdaiCartesian_point
*)cartesian_pnts.at(i));
// Vertex points (topological, references actual 3D geometry)
- vertex_pnts.at(i) = registry->ObjCreate("VERTEX_POINT");
+ vertex_pnts.at(i) = info->registry->ObjCreate("VERTEX_POINT");
((SdaiVertex_point *)vertex_pnts.at(i))->name_("''");
((SdaiVertex_point *)vertex_pnts.at(i))->vertex_geometry_((const
SdaiPoint_ptr)cartesian_pnts.at(i));
- instance_list->Append(vertex_pnts.at(i), completeSE);
+ info->instance_list->Append(vertex_pnts.at(i), completeSE);
}
// 3D curves
@@ -735,14 +736,14 @@
* create our own
*/
- three_dimensional_curves.at(i) = registry->ObjCreate("LINE");
+ three_dimensional_curves.at(i) = info->registry->ObjCreate("LINE");
SdaiLine *curr_line = (SdaiLine *)three_dimensional_curves.at(i);
- curr_line->pnt_((SdaiCartesian_point
*)registry->ObjCreate("CARTESIAN_POINT"));
+ curr_line->pnt_((SdaiCartesian_point
*)info->registry->ObjCreate("CARTESIAN_POINT"));
ON_3dPoint_to_Cartesian_point(&(m_line->from), curr_line->pnt_());
- curr_line->dir_((SdaiVector *)registry->ObjCreate("VECTOR"));
+ curr_line->dir_((SdaiVector *)info->registry->ObjCreate("VECTOR"));
SdaiVector *curr_dir = curr_line->dir_();
- curr_dir->orientation_((SdaiDirection
*)registry->ObjCreate("DIRECTION"));
+ curr_dir->orientation_((SdaiDirection
*)info->registry->ObjCreate("DIRECTION"));
ON_3dVector on_dir = m_line->Direction();
ON_3dVector_to_Direction(&(on_dir),
curr_line->dir_()->orientation_());
curr_line->dir_()->magnitude_(m_line->Length());
@@ -751,10 +752,10 @@
curr_line->dir_()->name_("''");
curr_line->name_("''");
- instance_list->Append(curr_line->pnt_(), completeSE);
- instance_list->Append(curr_dir->orientation_(), completeSE);
- instance_list->Append(curr_line->dir_(), completeSE);
- instance_list->Append(three_dimensional_curves.at(i), completeSE);
+ info->instance_list->Append(curr_line->pnt_(), completeSE);
+ info->instance_list->Append(curr_dir->orientation_(), completeSE);
+ info->instance_list->Append(curr_line->dir_(), completeSE);
+ info->instance_list->Append(three_dimensional_curves.at(i),
completeSE);
curve_converted = 1;
}
@@ -766,12 +767,12 @@
std::cout << "Have NurbsCurve\n";
if (n_curve->IsRational()) {
std::cout << "TODO - Have Rational NurbsCurve\n";
- three_dimensional_curves.at(i) =
registry->ObjCreate("RATIONAL_B_SPLINE_CURVE");
+ three_dimensional_curves.at(i) =
info->registry->ObjCreate("RATIONAL_B_SPLINE_CURVE");
} else {
- three_dimensional_curves.at(i) =
registry->ObjCreate("B_SPLINE_CURVE_WITH_KNOTS");
+ three_dimensional_curves.at(i) =
info->registry->ObjCreate("B_SPLINE_CURVE_WITH_KNOTS");
SdaiB_spline_curve *curr_curve = (SdaiB_spline_curve
*)three_dimensional_curves.at(i);
curr_curve->degree_(n_curve->Degree());
- ON_NurbsCurveCV_to_EntityAggregate(n_curve, curr_curve,
registry, instance_list);
+ ON_NurbsCurveCV_to_EntityAggregate(n_curve, curr_curve,
info->registry, info->instance_list);
SdaiB_spline_curve_with_knots *curve_knots =
(SdaiB_spline_curve_with_knots *)three_dimensional_curves.at(i);
ON_NurbsCurveKnots_to_Aggregates(n_curve, curve_knots);
}
@@ -784,7 +785,7 @@
*/
((SdaiB_spline_curve
*)three_dimensional_curves.at(i))->self_intersect_(LFalse);
((SdaiB_spline_curve *)three_dimensional_curves.at(i))->name_("''");
- instance_list->Append(three_dimensional_curves.at(i), completeSE);
+ info->instance_list->Append(three_dimensional_curves.at(i),
completeSE);
curve_converted = 1;
}
@@ -798,8 +799,8 @@
// edge topology - ON_BrepEdge -> edge curves and oriented edges
for (int i = 0; i < brep->m_E.Count(); ++i) {
ON_BrepEdge *edge = &(brep->m_E[i]);
- edge_curves.at(i) = registry->ObjCreate("EDGE_CURVE");
- instance_list->Append(edge_curves.at(i), completeSE);
+ edge_curves.at(i) = info->registry->ObjCreate("EDGE_CURVE");
+ info->instance_list->Append(edge_curves.at(i), completeSE);
SdaiEdge_curve *e_curve = (SdaiEdge_curve *)edge_curves.at(i);
e_curve->name_("''");
@@ -817,8 +818,8 @@
for (int i = 0; i < brep->m_L.Count(); ++i) {
ON_BrepLoop *loop= &(brep->m_L[i]);
std::cout << "Loop " << i << "\n";
- edge_loops.at(i) = registry->ObjCreate("EDGE_LOOP");
- instance_list->Append(edge_loops.at(i), completeSE);
+ edge_loops.at(i) = info->registry->ObjCreate("EDGE_LOOP");
+ info->instance_list->Append(edge_loops.at(i), completeSE);
((SdaiEdge_loop *)edge_loops.at(i))->name_("''");
// Why doesn't SdaiEdge_loop's edge_list_() function give use
@@ -828,7 +829,7 @@
// output.
SdaiPath *e_loop_path = (SdaiPath *)edge_loops.at(i)->GetNextMiEntity();
for (int l = 0; l < loop->TrimCount(); ++l) {
- int trim_edge = Add_Edge(loop->Trim(l), registry, instance_list,
&oriented_edges, &edge_curves, &vertex_pnts);
+ int trim_edge = Add_Edge(loop->Trim(l), info->registry,
info->instance_list, &oriented_edges, &edge_curves, &vertex_pnts);
if (trim_edge >= 0)
e_loop_path->edge_list_()->AddNode(new
EntityNode((SDAI_Application_instance *)(oriented_edges.at(trim_edge))));
}
@@ -858,13 +859,13 @@
ON_NurbsSurface p_nurb;
p_surface->GetNurbForm(p_nurb);
- surfaces.at(i) = registry->ObjCreate("B_SPLINE_SURFACE_WITH_KNOTS");
+ surfaces.at(i) =
info->registry->ObjCreate("B_SPLINE_SURFACE_WITH_KNOTS");
SdaiB_spline_surface *curr_surface = (SdaiB_spline_surface
*)surfaces.at(i);
curr_surface->name_("''");
curr_surface->u_degree_(p_nurb.Degree(0));
curr_surface->v_degree_(p_nurb.Degree(1));
- ON_NurbsSurfaceCV_to_GenericAggregate(&p_nurb, curr_surface,
registry, instance_list);
+ ON_NurbsSurfaceCV_to_GenericAggregate(&p_nurb, curr_surface,
info->registry, info->instance_list);
SdaiB_spline_surface_with_knots *surface_knots =
(SdaiB_spline_surface_with_knots *)surfaces.at(i);
ON_NurbsSurfaceKnots_to_Aggregates(&p_nurb, surface_knots);
@@ -874,7 +875,7 @@
/* TODO - need to recognize when these should be true */
curr_surface->u_closed_(LFalse);
curr_surface->v_closed_(LFalse);
- instance_list->Append(surfaces.at(i), completeSE);
+ info->instance_list->Append(surfaces.at(i), completeSE);
surface_converted = 1;
}
@@ -884,13 +885,13 @@
if (n_surface && !surface_converted) {
std::cout << "Have NurbsSurface\n";
- surfaces.at(i) = registry->ObjCreate("B_SPLINE_SURFACE_WITH_KNOTS");
+ surfaces.at(i) =
info->registry->ObjCreate("B_SPLINE_SURFACE_WITH_KNOTS");
SdaiB_spline_surface *curr_surface = (SdaiB_spline_surface
*)surfaces.at(i);
curr_surface->name_("''");
curr_surface->u_degree_(n_surface->Degree(0));
curr_surface->v_degree_(n_surface->Degree(1));
- ON_NurbsSurfaceCV_to_GenericAggregate(n_surface, curr_surface,
registry, instance_list);
+ ON_NurbsSurfaceCV_to_GenericAggregate(n_surface, curr_surface,
info->registry, info->instance_list);
SdaiB_spline_surface_with_knots *surface_knots =
(SdaiB_spline_surface_with_knots *)surfaces.at(i);
ON_NurbsSurfaceKnots_to_Aggregates(n_surface, surface_knots);
@@ -900,7 +901,7 @@
/* TODO - need to recognize when these should be true */
curr_surface->u_closed_(LFalse);
curr_surface->v_closed_(LFalse);
- instance_list->Append(surfaces.at(i), completeSE);
+ info->instance_list->Append(surfaces.at(i), completeSE);
surface_converted = 1;
}
@@ -913,13 +914,13 @@
ON_NurbsSurface sum_nurb;
sum_surface->GetNurbForm(sum_nurb);
- surfaces.at(i) = registry->ObjCreate("B_SPLINE_SURFACE_WITH_KNOTS");
+ surfaces.at(i) =
info->registry->ObjCreate("B_SPLINE_SURFACE_WITH_KNOTS");
SdaiB_spline_surface *curr_surface = (SdaiB_spline_surface
*)surfaces.at(i);
curr_surface->name_("''");
curr_surface->u_degree_(sum_nurb.Degree(0));
curr_surface->v_degree_(sum_nurb.Degree(1));
- ON_NurbsSurfaceCV_to_GenericAggregate(&sum_nurb, curr_surface,
registry, instance_list);
+ ON_NurbsSurfaceCV_to_GenericAggregate(&sum_nurb, curr_surface,
info->registry, info->instance_list);
SdaiB_spline_surface_with_knots *surface_knots =
(SdaiB_spline_surface_with_knots *)surfaces.at(i);
ON_NurbsSurfaceKnots_to_Aggregates(&sum_nurb, surface_knots);
@@ -929,7 +930,7 @@
/* TODO - need to recognize when these should be true */
curr_surface->u_closed_(LFalse);
curr_surface->v_closed_(LFalse);
- instance_list->Append(surfaces.at(i), completeSE);
+ info->instance_list->Append(surfaces.at(i), completeSE);
surface_converted = 1;
}
@@ -942,7 +943,7 @@
// faces
for (int i = 0; i < brep->m_F.Count(); ++i) {
ON_BrepFace* face = &(brep->m_F[i]);
- faces.at(i) = registry->ObjCreate("ADVANCED_FACE");
+ faces.at(i) = info->registry->ObjCreate("ADVANCED_FACE");
SdaiAdvanced_face *step_face = (SdaiAdvanced_face *)faces.at(i);
step_face->name_("''");
@@ -955,30 +956,30 @@
for (int j = 0; j < face->LoopCount(); ++j) {
ON_BrepLoop *curr_loop = face->Loop(j);
if (curr_loop == face->OuterLoop()) {
- SdaiFace_outer_bound *outer_bound = (SdaiFace_outer_bound
*)registry->ObjCreate("FACE_OUTER_BOUND");
+ SdaiFace_outer_bound *outer_bound = (SdaiFace_outer_bound
*)info->registry->ObjCreate("FACE_OUTER_BOUND");
outer_bound->name_("''");
- instance_list->Append(outer_bound, completeSE);
+ info->instance_list->Append(outer_bound, completeSE);
outer_bound->bound_((SdaiLoop
*)edge_loops.at(curr_loop->m_loop_index));
// TODO - When should this be false?
outer_bound->orientation_(BTrue);
bounds->AddNode(new EntityNode((SDAI_Application_instance
*)outer_bound));
} else {
- SdaiFace_bound *inner_bound = (SdaiFace_bound
*)registry->ObjCreate("FACE_BOUND");
+ SdaiFace_bound *inner_bound = (SdaiFace_bound
*)info->registry->ObjCreate("FACE_BOUND");
inner_bound->name_("''");
- instance_list->Append(inner_bound, completeSE);
+ info->instance_list->Append(inner_bound, completeSE);
inner_bound->bound_((SdaiLoop
*)edge_loops.at(curr_loop->m_loop_index));
// TODO - When should this be false?
inner_bound->orientation_(BTrue);
bounds->AddNode(new EntityNode((SDAI_Application_instance
*)inner_bound));
}
}
- instance_list->Append(step_face, completeSE);
+ info->instance_list->Append(step_face, completeSE);
}
// Closed shell that assembles the faces
- SdaiClosed_shell *closed_shell = (SdaiClosed_shell
*)registry->ObjCreate("CLOSED_SHELL");
+ SdaiClosed_shell *closed_shell = (SdaiClosed_shell
*)info->registry->ObjCreate("CLOSED_SHELL");
closed_shell->name_("''");
- instance_list->Append(closed_shell, completeSE);
+ info->instance_list->Append(closed_shell, completeSE);
EntityAggregate *shell_faces = closed_shell->cfs_faces_();
for (int i = 0; i < brep->m_F.Count(); ++i) {
@@ -986,23 +987,23 @@
}
// Solid manifold BRep
- SdaiManifold_solid_brep *manifold_solid_brep = (SdaiManifold_solid_brep
*)registry->ObjCreate("MANIFOLD_SOLID_BREP");
- instance_list->Append(manifold_solid_brep, completeSE);
+ SdaiManifold_solid_brep *manifold_solid_brep = (SdaiManifold_solid_brep
*)info->registry->ObjCreate("MANIFOLD_SOLID_BREP");
+ info->instance_list->Append(manifold_solid_brep, completeSE);
manifold_solid_brep->outer_(closed_shell);
manifold_solid_brep->name_("''");
// Advanced BRep shape representation - this is the object step-g will
look for
- SdaiAdvanced_brep_shape_representation *advanced_brep=
(SdaiAdvanced_brep_shape_representation
*)registry->ObjCreate("ADVANCED_BREP_SHAPE_REPRESENTATION");
+ SdaiAdvanced_brep_shape_representation *advanced_brep=
(SdaiAdvanced_brep_shape_representation
*)info->registry->ObjCreate("ADVANCED_BREP_SHAPE_REPRESENTATION");
advanced_brep->name_("'brep.s'");
- instance_list->Append(advanced_brep, completeSE);
+ info->instance_list->Append(advanced_brep, completeSE);
EntityAggregate *items = advanced_brep->items_();
items->AddNode(new EntityNode((SDAI_Application_instance
*)manifold_solid_brep));
advanced_brep->context_of_items_((SdaiRepresentation_context *) context);
// Top level structures
- SdaiRepresentation *shape_rep = Add_Shape_Representation(registry,
instance_list, (SdaiRepresentation_context *)context);
- (void *)Add_Shape_Representation_Relationship(registry, instance_list,
shape_rep, (SdaiRepresentation *)advanced_brep);
- (void *)Add_Shape_Definition_Representation(registry, instance_list,
(SdaiRepresentation *)shape_rep);
+ SdaiRepresentation *shape_rep = Add_Shape_Representation(info->registry,
info->instance_list, (SdaiRepresentation_context *)context);
+ (void *)Add_Shape_Representation_Relationship(info->registry,
info->instance_list, shape_rep, (SdaiRepresentation *)advanced_brep);
+ (void *)Add_Shape_Definition_Representation(info->registry,
info->instance_list, (SdaiRepresentation *)shape_rep);
return true;
}
Modified: brlcad/trunk/src/conv/step/g-step/ON_Brep.h
===================================================================
--- brlcad/trunk/src/conv/step/g-step/ON_Brep.h 2013-08-28 18:57:04 UTC (rev
57229)
+++ brlcad/trunk/src/conv/step/g-step/ON_Brep.h 2013-08-28 18:58:26 UTC (rev
57230)
@@ -26,8 +26,28 @@
#include "STEPWrapper.h"
-bool ON_BRep_to_STEP(ON_Brep *brep, Registry *registry, InstMgr
*instance_list);
+struct Exporter_Info_AP203 {
+ Registry *registry;
+ InstMgr *instance_list;
+ std::vector<STEPentity *> cartesian_pnts;
+ std::vector<STEPentity *> vertex_pnts;
+ std::vector<STEPentity *> three_dimensional_curves;
+ std::vector<STEPentity *> edge_curves;
+ std::vector<STEPentity *> oriented_edges;
+ std::vector<STEPentity *> edge_loops;
+ std::vector<STEPentity *> outer_bounds;
+ std::vector<STEPentity *> surfaces;
+ std::vector<STEPentity *> faces;
+ SdaiClosed_shell *closed_shell;
+ SdaiManifold_solid_brep *manifold_solid_brep;
+ SdaiAdvanced_brep_shape_representation *advanced_brep;
+ std::map<int, std::pair<STEPentity *, STEPentity *> > sdai_curve_to_splits;
+ std::map<int, STEPentity * > split_midpt_vertex;
+};
+
+bool ON_BRep_to_STEP(ON_Brep *brep, Exporter_Info_AP203 *info);
+
#endif /* ON_BREP_H_ */
/*
Modified: brlcad/trunk/src/conv/step/g-step/g-step.cpp
===================================================================
--- brlcad/trunk/src/conv/step/g-step/g-step.cpp 2013-08-28 18:57:04 UTC
(rev 57229)
+++ brlcad/trunk/src/conv/step/g-step/g-step.cpp 2013-08-28 18:58:26 UTC
(rev 57230)
@@ -134,10 +134,15 @@
ON_String ss = wstr;
//bu_log("Brep:\n %s\n", ss.Array());
+ Exporter_Info_AP203 *info = new Exporter_Info_AP203();
+
Registry *registry = new Registry(SchemaInit);
InstMgr instance_list;
STEPfile *sfile = new STEPfile(*registry, instance_list);
+ info->registry = registry;
+ info->instance_list = &instance_list;
+
registry->ResetSchemas();
registry->ResetEntities();
@@ -175,7 +180,7 @@
header_instances->Append((SDAI_Application_instance *)fs, completeSE);
/* Now, add actual DATA */
- ON_BRep_to_STEP(brep, registry, &instance_list);
+ ON_BRep_to_STEP(brep, info);
/* Write STEP file */
if (!bu_file_exists(output_file, NULL)) {
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits