Revision: 55659
http://sourceforge.net/p/brlcad/code/55659
Author: phoenixyjll
Date: 2013-06-04 13:45:30 +0000 (Tue, 04 Jun 2013)
Log Message:
-----------
Extended the brep command to handle P/P, P/C, P/S, C/C and C/S.
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 2013-06-04 12:13:48 UTC (rev 55658)
+++ brlcad/trunk/src/libged/brep.c 2013-06-04 13:45:30 UTC (rev 55659)
@@ -42,7 +42,12 @@
RT_EXPORT extern int brep_command(struct bu_vls *vls, const char *solid_name,
const struct rt_tess_tol *ttol, const struct bn_tol *tol, 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);
+RT_EXPORT extern int brep_intersect_point_point(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+RT_EXPORT extern int brep_intersect_point_curve(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+RT_EXPORT extern int brep_intersect_point_surface(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+RT_EXPORT extern int brep_intersect_curve_curve(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+RT_EXPORT extern int brep_intersect_curve_surface(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+RT_EXPORT extern int brep_intersect_surface_surface(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j, struct bn_vlblock *vbp);
RT_EXPORT extern int rt_brep_boolean(struct rt_db_internal *out, const struct
rt_db_internal *ip1, const struct rt_db_internal *ip2, const int operation);
#else
extern int brep_surface_plot(struct ged *gedp, struct brep_specific* bs,
struct rt_brep_internal* bi, struct bn_vlblock *vbp, int index);
@@ -80,7 +85,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
two surfaces\n");
+ bu_vls_printf(gedp->ged_result_str, "\tintersect obj2 i j
[PP|PC|PS|CC|CS|SS] - BREP intersections\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;
@@ -116,9 +121,9 @@
struct rt_db_internal intern2;
int i, j;
- /* we need exactly 6 arguments */
- if (argc != 6) {
- bu_vls_printf(gedp->ged_result_str, "There should be 6 arguments
for intersection.\n");
+ /* we need exactly 6 or 7 arguments */
+ if (argc != 6 && argc != 7) {
+ bu_vls_printf(gedp->ged_result_str, "There should be 6 or 7
arguments for intersection.\n");
bu_vls_printf(gedp->ged_result_str, "See the usage for help.\n");
return GED_ERROR;
}
@@ -143,8 +148,20 @@
j = atoi(argv[5]);
vbp = rt_vlblock_init();
- if (argc == 6) {
- brep_intersect(&intern, &intern2, i, j, vbp);
+ if (argc == 6 || BU_STR_EQUAL(argv[6], "SS")) {
+ brep_intersect_surface_surface(&intern, &intern2, i, j, vbp);
+ } else if (BU_STR_EQUAL(argv[6], "PP")) {
+ brep_intersect_point_point(&intern, &intern2, i, j);
+ } else if (BU_STR_EQUAL(argv[6], "PC")) {
+ brep_intersect_point_curve(&intern, &intern2, i, j);
+ } else if (BU_STR_EQUAL(argv[6], "PS")) {
+ brep_intersect_point_surface(&intern, &intern2, i, j);
+ } else if (BU_STR_EQUAL(argv[6], "CC")) {
+ brep_intersect_curve_curve(&intern, &intern2, i, j);
+ } else if (BU_STR_EQUAL(argv[6], "PC")) {
+ brep_intersect_curve_surface(&intern, &intern2, i, j);
+ } else {
+ bu_vls_printf(gedp->ged_result_str, "Invalid intersection type
%s.\n", argv[6]);
}
_ged_cvt_vlblock_to_solids(gedp, vbp, namebuf, 0);
Modified: brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp
===================================================================
--- brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp 2013-06-04
12:13:48 UTC (rev 55658)
+++ brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp 2013-06-04
13:45:30 UTC (rev 55659)
@@ -55,7 +55,12 @@
RT_EXPORT extern int brep_command(struct bu_vls *vls, const char
*solid_name, const struct rt_tess_tol* ttol, const struct bn_tol* tol, 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);
+ RT_EXPORT extern int brep_intersect_point_point(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+ RT_EXPORT extern int brep_intersect_point_curve(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+ RT_EXPORT extern int brep_intersect_point_surface(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+ RT_EXPORT extern int brep_intersect_curve_curve(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+ RT_EXPORT extern int brep_intersect_curve_surface(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j);
+ RT_EXPORT extern int brep_intersect_surface_surface(struct rt_db_internal
*intern1, struct rt_db_internal *intern2, int i, int j, struct bn_vlblock *vbp);
#ifdef __cplusplus
}
#endif
@@ -2769,7 +2774,8 @@
}
-int brep_intersect(struct rt_db_internal *intern1, struct rt_db_internal
*intern2, int i, int j, struct bn_vlblock *vbp)
+int
+brep_intersect_point_point(struct rt_db_internal *intern1, struct
rt_db_internal *intern2, int i, int j)
{
RT_CK_DB_INTERNAL(intern1);
RT_CK_DB_INTERNAL(intern2);
@@ -2782,6 +2788,136 @@
ON_Brep *brep1 = bi1->brep;
ON_Brep *brep2 = bi2->brep;
+ if (i < 0 || i >= brep1->m_V.Count() || j < 0 || j >= brep2->m_V.Count()) {
+ bu_log("Out of range: \n");
+ bu_log("\t0 <= i <= %d\n", brep1->m_V.Count() - 1);
+ bu_log("\t0 <= j <= %d\n", brep2->m_V.Count() - 1);
+ return -1;
+ }
+
+ ON_ClassArray<ON_PX_EVENT> events;
+ if (ON_Intersect(brep1->m_V[i].Point(), brep2->m_V[j].Point(), events)) {
+ for (int k = 0; k < events.Count(); k++) {
+ ON_wString wstr;
+ ON_TextLog textlog(wstr);
+ events[i].Dump(textlog);
+ ON_String str = ON_String(wstr);
+ bu_log("Intersection event %d:\n %s", k + 1, str.Array());
+ }
+ } else {
+ bu_log("No intersection.\n");
+ }
+
+ return 0;
+}
+
+
+int
+brep_intersect_point_curve(struct rt_db_internal *intern1, struct
rt_db_internal *intern2, int i, int j)
+{
+ 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;
+
+ if (i < 0 || i >= brep1->m_V.Count() || j < 0 || j >= brep2->m_C3.Count())
{
+ bu_log("Out of range: \n");
+ bu_log("\t0 <= i <= %d\n", brep1->m_V.Count() - 1);
+ bu_log("\t0 <= j <= %d\n", brep2->m_C3.Count() - 1);
+ return -1;
+ }
+
+ ON_ClassArray<ON_PX_EVENT> events;
+ if (ON_Intersect(brep1->m_V[i].Point(), *(brep2->m_C3[j]), events)) {
+ for (int k = 0; k < events.Count(); k++) {
+ ON_wString wstr;
+ ON_TextLog textlog(wstr);
+ events[i].Dump(textlog);
+ ON_String str = ON_String(wstr);
+ bu_log("Intersection event %d:\n %s", k + 1, str.Array());
+ }
+ } else {
+ bu_log("No intersection.\n");
+ }
+
+ return 0;
+}
+
+
+int
+brep_intersect_point_surface(struct rt_db_internal *intern1, struct
rt_db_internal *intern2, int i, int j)
+{
+ 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;
+
+ if (i < 0 || i >= brep1->m_V.Count() || j < 0 || j >= brep2->m_S.Count()) {
+ bu_log("Out of range: \n");
+ bu_log("\t0 <= i <= %d\n", brep1->m_V.Count() - 1);
+ bu_log("\t0 <= j <= %d\n", brep2->m_S.Count() - 1);
+ return -1;
+ }
+
+ ON_ClassArray<ON_PX_EVENT> events;
+ if (ON_Intersect(brep1->m_V[i].Point(), *(brep2->m_S[j]), events)) {
+ for (int k = 0; k < events.Count(); k++) {
+ ON_wString wstr;
+ ON_TextLog textlog(wstr);
+ events[i].Dump(textlog);
+ ON_String str = ON_String(wstr);
+ bu_log("Intersection event %d:\n %s", k + 1, str.Array());
+ }
+ } else {
+ bu_log("No intersection.\n");
+ }
+
+ return 0;
+}
+
+
+int
+brep_intersect_curve_curve(struct rt_db_internal *, struct rt_db_internal *,
int, int)
+{
+ // Curve-curve intersection is to be implemented.
+ return -1;
+}
+
+
+int
+brep_intersect_curve_surface(struct rt_db_internal *, struct rt_db_internal *,
int, int)
+{
+ // Curve-surface intersection is to be implemented.
+ return -1;
+}
+
+
+int
+brep_intersect_surface_surface(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;
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. A cloud service to automate IT design, transition and operations
2. Dashboards that offer high-level views of enterprise services
3. A single system of record for all IT processes
http://p.sf.net/sfu/servicenow-d2d-j
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits