[brlcad-commits] SF.net SVN: brlcad:[51573] brlcad/trunk/src
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <pho...@us...> - 2012-07-18 06:33:18
|
Revision: 51573 http://brlcad.svn.sourceforge.net/brlcad/?rev=51573&view=rev Author: phoenixyjll Date: 2012-07-18 06:33:12 +0000 (Wed, 18 Jul 2012) Log Message: ----------- Add an option to the brep command in MGED to test surface-surface intersection. Modified Paths: -------------- brlcad/trunk/src/libged/brep.c brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp Modified: brlcad/trunk/src/libged/brep.c =================================================================== --- brlcad/trunk/src/libged/brep.c 2012-07-18 06:31:43 UTC (rev 51572) +++ brlcad/trunk/src/libged/brep.c 2012-07-18 06:33:12 UTC (rev 51573) @@ -40,6 +40,7 @@ RT_EXPORT extern int brep_command(struct bu_vls *vls, struct brep_specific* bs, struct rt_brep_internal* bi, struct bn_vlblock *vbp, int argc, const char *argv[], char *commtag); RT_EXPORT extern int brep_conversion(struct rt_db_internal *intern, ON_Brep **brep); RT_EXPORT extern int brep_conversion_comb(struct rt_db_internal *old_internal, char *name, char *suffix, struct rt_wdb *wdbp, fastf_t local2mm); +RT_EXPORT extern int brep_intersect(struct rt_db_internal *intern1, struct rt_db_internal *intern2, int i, int j, struct bn_vlblock *vbp); #else extern int brep_surface_plot(struct ged *gedp, struct brep_specific* bs, struct rt_brep_internal* bi, struct bn_vlblock *vbp, int index); #endif @@ -76,6 +77,7 @@ bu_vls_printf(gedp->ged_result_str, "\tplot - plot entire BREP\n"); bu_vls_printf(gedp->ged_result_str, "\tplot S [index] - plot specific BREP 'surface'\n"); bu_vls_printf(gedp->ged_result_str, "\tplot F [index] - plot specific BREP 'face'\n"); + bu_vls_printf(gedp->ged_result_str, "\tintersect obj2 i j - intersect obj's ith surface and obj2' jth surface\n"); bu_vls_printf(gedp->ged_result_str, "\t[brepname] - convert the non-BREP object to BREP form\n"); bu_vls_printf(gedp->ged_result_str, "\t[suffix] - convert non-BREP comb to unevaluated BREP form\n"); return GED_HELP; @@ -106,6 +108,40 @@ RT_CK_DB_INTERNAL(&intern); bi = (struct rt_brep_internal*)intern.idb_ptr; + if (BU_STR_EQUAL(argv[2], "intersect")) { + struct rt_db_internal intern2; + int i, j; + + if ((ndp = db_lookup(gedp->ged_wdbp->dbip, argv[3], LOOKUP_NOISY)) == RT_DIR_NULL) { + bu_vls_printf(gedp->ged_result_str, "Error: %s is not a solid or does not exist in database", argv[3]); + return GED_ERROR; + } else { + real_flag = (ndp->d_addr == RT_DIR_PHONY_ADDR) ? 0 : 1; + } + + if (!real_flag) { + /* solid doesnt exists - don't kill */ + bu_vls_printf(gedp->ged_result_str, "Error: %s is not a real solid", argv[3]); + return GED_OK; + } + + GED_DB_GET_INTERNAL(gedp, &intern2, ndp, bn_mat_identity, &rt_uniresource, GED_ERROR); + + i = atoi(argv[4]); + j = atoi(argv[5]); + vbp = rt_vlblock_init(); + + brep_intersect(&intern, &intern2, i, j, vbp); + + _ged_cvt_vlblock_to_solids(gedp, vbp, namebuf, 0); + rt_vlblock_free(vbp); + vbp = (struct bn_vlblock *)NULL; + + rt_db_free_internal(&intern); + rt_db_free_internal(&intern2); + return GED_OK; + } + if (!RT_BREP_TEST_MAGIC(bi)) { /* The solid is not in brep form. Covert it to brep. */ Modified: brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp 2012-07-18 06:31:43 UTC (rev 51572) +++ brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp 2012-07-18 06:33:12 UTC (rev 51573) @@ -53,6 +53,7 @@ RT_EXPORT extern int brep_command(struct bu_vls *vls, struct brep_specific* bs, struct rt_brep_internal* bi, struct bn_vlblock *vbp, int argc, const char *argv[], char *commtag); RT_EXPORT extern int brep_conversion(struct rt_db_internal* intern, ON_Brep** brep); RT_EXPORT extern int brep_conversion_comb(struct rt_db_internal *old_internal, char *name, char *suffix, struct rt_wdb *wdbp, fastf_t local2mm); + RT_EXPORT extern int brep_intersect(struct rt_db_internal *intern1, struct rt_db_internal *intern2, int i, int j, struct bn_vlblock* vbp); #ifdef __cplusplus } #endif @@ -550,13 +551,13 @@ void -plotsurface(ON_Surface &surf, struct bn_vlblock *vbp, int isocurveres, int gridres) +plotsurface(ON_Surface &surf, struct bn_vlblock *vbp, int isocurveres, int gridres, const int red = 255, const int green = 218, const int blue = 185) { register struct bu_list *vhead; double pt1[3], pt2[3]; ON_2dPoint from, to; - vhead = rt_vlblock_find(vbp, PEACH); + vhead = rt_vlblock_find(vbp, red, green, blue); ON_Interval udom = surf.Domain(0); ON_Interval vdom = surf.Domain(1); @@ -651,13 +652,13 @@ void -plotcurve(ON_Curve &curve, struct bn_vlblock *vbp, int plotres) +plotcurve(ON_Curve &curve, struct bn_vlblock *vbp, int plotres, const int red = 255, const int green = 255, const int blue = 0) { register struct bu_list *vhead; double pt1[3], pt2[3]; ON_2dPoint from, to; - vhead = rt_vlblock_find(vbp, YELLOW); + vhead = rt_vlblock_find(vbp, red, green, blue); if (curve.IsLinear()) { /* @@ -2553,6 +2554,48 @@ } +int brep_intersect(struct rt_db_internal *intern1, struct rt_db_internal *intern2, int i, int j, struct bn_vlblock *vbp) { + RT_CK_DB_INTERNAL(intern1); + RT_CK_DB_INTERNAL(intern2); + struct rt_brep_internal *bi1, *bi2; + bi1 = (struct rt_brep_internal *)intern1->idb_ptr; + bi2 = (struct rt_brep_internal *)intern2->idb_ptr; + RT_BREP_CK_MAGIC(bi1); + RT_BREP_CK_MAGIC(bi2); + + ON_Brep *brep1 = bi1->brep; + ON_Brep *brep2 = bi2->brep; + + ON_NurbsSurface surf1; + ON_NurbsSurface surf2; + ON_SimpleArray<ON_NurbsCurve*> curve; + + if (i < 0 || i >= brep1->m_S.Count() || j < 0 || j >= brep2->m_S.Count()) { + bu_log("Out of range: \n"); + bu_log("\t0 <= i <= %d\n", brep1->m_S.Count() - 1); + bu_log("\t0 <= j <= %d\n", brep2->m_S.Count() - 1); + return -1; + } + + brep1->m_S[i]->GetNurbForm(surf1); + brep2->m_S[j]->GetNurbForm(surf2); + + if (brlcad::surface_surface_intersection(&surf1, &surf2, curve)) { + bu_log("Intersection failed\n"); + return -1; + } + + plotsurface(surf1, vbp, 100, 10, PURERED); + plotsurface(surf2, vbp, 100, 10, BLUE); + for (int i = 0; i < curve.Count(); i++) { + plotcurve(*(curve[i]), vbp, 100, GREEN); + delete curve[i]; + } + + return 0; +} + + /** @} */ /* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |