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

Reply via email to