[brlcad-commits] SF.net SVN: brlcad:[55336] brlcad/trunk/src/libbrep
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <sta...@us...> - 2013-05-08 17:15:34
|
Revision: 55336 http://sourceforge.net/p/brlcad/code/55336 Author: starseeker Date: 2013-05-08 17:15:28 +0000 (Wed, 08 May 2013) Log Message: ----------- Add a 'tools' file for holding useful routines, analgous to the opennurbs_brep_tools.cpp file. Start with the sub-surface extraction routine. Modified Paths: -------------- brlcad/trunk/src/libbrep/CMakeLists.txt Added Paths: ----------- brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp brlcad/trunk/src/libbrep/libbrep_brep_tools.h Modified: brlcad/trunk/src/libbrep/CMakeLists.txt =================================================================== --- brlcad/trunk/src/libbrep/CMakeLists.txt 2013-05-08 16:59:34 UTC (rev 55335) +++ brlcad/trunk/src/libbrep/CMakeLists.txt 2013-05-08 17:15:28 UTC (rev 55336) @@ -20,6 +20,7 @@ set(LIBBREP_SOURCES intersect.cpp + libbrep_brep_tools.cpp opennurbs_ext.cpp #opennurbs_fit.cpp PullbackCurve.cpp @@ -27,6 +28,7 @@ ) set(libbrep_ignored_files + libbrep_brep_tools.h opennurbs_fit.h opennurbs_fit.cpp PullbackCurve.h Added: brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp =================================================================== --- brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp (rev 0) +++ brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp 2013-05-08 17:15:28 UTC (rev 55336) @@ -0,0 +1,119 @@ +/* L I B B R E P _ B R E P _ T O O L S . C P P + * BRL-CAD + * + * Copyright (c) 2013 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. + */ +/** @file libbrep_brep_tools.cpp + * + * Utility routines for working with geometry. + */ + +#include <vector> +#include <iostream> + +#include "opennurbs.h" + +// For any pre-existing surface passed as one of the t* args, this is a no-op +void ON_Surface_Create_Scratch_Surfaces( + ON_Surface **t1, + ON_Surface **t2, + ON_Surface **t3, + ON_Surface **t4) +{ + if (!(*t1)) { + ON_NurbsSurface *nt1 = ON_NurbsSurface::New(); + (*t1)= (ON_Surface *)(nt1); + } + if (!(*t2)) { + ON_NurbsSurface *nt2 = ON_NurbsSurface::New(); + (*t2)= (ON_Surface *)(nt2); + } + if (!(*t3)) { + ON_NurbsSurface *nt3 = ON_NurbsSurface::New(); + (*t3)= (ON_Surface *)(nt3); + } + if (!(*t4)) { + ON_NurbsSurface *nt4 = ON_NurbsSurface::New(); + (*t4)= (ON_Surface *)(nt4); + } +} + +bool ON_Surface_SubSurface( + const ON_Surface *srf, + ON_Interval *u_val, + ON_Interval *v_val, + ON_Surface **t1, + ON_Surface **t2, + ON_Surface **t3, + ON_Surface **t4, + ON_Surface **result + ) +{ + bool split = true; + int t1_del, t2_del, t3_del; + + // Make sure we have intervals with non-zero lengths + if ((u_val->Length() <= ON_ZERO_TOLERANCE) || (v_val->Length() <= ON_ZERO_TOLERANCE)) + return false; + + // If we have the original surface domain, just return true + if ((fabs(u_val->Min() - srf->Domain(0).m_t[0]) <= ON_ZERO_TOLERANCE) && + (fabs(u_val->Max() - srf->Domain(0).m_t[1]) <= ON_ZERO_TOLERANCE) && + (fabs(v_val->Min() - srf->Domain(1).m_t[0]) <= ON_ZERO_TOLERANCE) && + (fabs(v_val->Max() - srf->Domain(1).m_t[1]) <= ON_ZERO_TOLERANCE)) { + (*result) = (ON_Surface *)srf; + return true; + } + t1_del = (*t1) ? (0) : (1); + t2_del = (*t2) ? (0) : (1); + t3_del = (*t3) ? (0) : (1); + ON_Surface *ssplit = (ON_Surface *)srf; + ON_Surface_Create_Scratch_Surfaces(t1, t2, t3, t4); + if (fabs(u_val->Min() - srf->Domain(0).m_t[0]) > ON_ZERO_TOLERANCE) { + split = ssplit->Split(0, u_val->Min(), *t1, *t2); + ssplit = *t2; + } + if ((fabs(u_val->Max() - srf->Domain(0).m_t[1]) > ON_ZERO_TOLERANCE) && split) { + split = ssplit->Split(0, u_val->Max(), *t1, *t3); + ssplit = *t1; + } + if ((fabs(v_val->Min() - srf->Domain(1).m_t[0]) > ON_ZERO_TOLERANCE) && split) { + split = ssplit->Split(1, v_val->Min(), *t2, *t3); + ssplit = *t3; + } + if ((fabs(v_val->Max() - srf->Domain(1).m_t[1]) > ON_ZERO_TOLERANCE) && split) { + split = ssplit->Split(1, v_val->Max(), *t4, *t2); + (*result) = *t4; + } + if (t1_del) delete *t1; + if (t2_del) delete *t2; + if (t3_del) delete *t3; + (*result)->SetDomain(0,u_val->Min(), u_val->Max()); + (*result)->SetDomain(1,v_val->Min(), v_val->Max()); + return split; +} + + + +// Local Variables: +// tab-width: 8 +// mode: C++ +// c-basic-offset: 4 +// indent-tabs-mode: t +// c-file-style: "stroustrup" +// End: +// ex: shiftwidth=4 tabstop=8 Property changes on: brlcad/trunk/src/libbrep/libbrep_brep_tools.cpp ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: brlcad/trunk/src/libbrep/libbrep_brep_tools.h =================================================================== --- brlcad/trunk/src/libbrep/libbrep_brep_tools.h (rev 0) +++ brlcad/trunk/src/libbrep/libbrep_brep_tools.h 2013-05-08 17:15:28 UTC (rev 55336) @@ -0,0 +1,92 @@ +/* L I B B R E P _ B R E P _ T O O L S . H + * BRL-CAD + * + * Copyright (c) 2013 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 libbrep */ +/** @{ */ +/** @file libbrep_brep_tools.h + * + * Utility routines for working with geometry. + */ + +#ifndef __LIBBREP_BREP_TOOLS +#define __LIBBREP_BREP_TOOLS + +#include <vector> + +#include "opennurbs.h" + +#ifndef NURBS_EXPORT +# if defined(NURBS_DLL_EXPORTS) && defined(NURBS_DLL_IMPORTS) +# error "Only NURBS_DLL_EXPORTS or NURBS_DLL_IMPORTS can be defined, not both." +# elif defined(NURBS_DLL_EXPORTS) +# define NURBS_EXPORT __declspec(dllexport) +# elif defined(NURBS_DLL_IMPORTS) +# define NURBS_EXPORT __declspec(dllimport) +# else +# define NURBS_EXPORT +# endif +#endif + +/** + \brief Create a surface based on a subset of a parent surface + + Create a NURBS surface that corresponds to a subset + of an input surface, as defined by UV intervals. The + t parameters may be NULL, in which case working surfaces + will be created by the function. If supplied, existing + surfaces are reused to avoid extra malloc operations + and memory usage associated with creating the working + surfaces. + + @param srf parent ON_Surface + @param u_val U interval of proposed subsurface + @param v_val V interval of proposed subsurface + @param t1 surface used during split algorithm + @param t2 surface used during split algorithm + @param t3 surface used during split algorithm + @param t4 surface used during split algorithm + @param[out] result final subsurface + + @return @c true if surface creation is successful or if the subsurface + is the same as the parent surface, @c false if one or more split + operations failed. +*/ +NURBS_EXPORT +bool ON_Surface_SubSurface( + const ON_Surface *srf, + ON_Interval *u_val, + ON_Interval *v_val, + ON_Surface **t1, + ON_Surface **t2, + ON_Surface **t3, + ON_Surface **t4, + ON_Surface **result + ); + +#endif /* __LIBBREP_BREP_TOOLS */ +/** @} */ + +// Local Variables: +// tab-width: 8 +// mode: C++ +// c-basic-offset: 4 +// indent-tabs-mode: t +// c-file-style: "stroustrup" +// End: +// ex: shiftwidth=4 tabstop=8 Property changes on: brlcad/trunk/src/libbrep/libbrep_brep_tools.h ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |