admin 发表于 2018-8-23 08:32:50

NXOpen C++ CAM二次开发:获取workpiece的所有几何Tag值


NXOpen C++ CAM二次开发:获取workpiece的所有几何Tag值


static void do_it(void)
{
    logical is_initialized;
    int object_count;
    int type;
    int subtype;
    tag_t *objects;




    char mesg;


    // Get the work part
    Session *theSession = Session::GetSession();
    Part *workPart(theSession->Parts()->Work());
    Part *displayPart(theSession->Parts()->Display());




    if (UF_CALL(UF_CAM_is_session_initialized(&is_initialized)) || (is_initialized == FALSE)) return;


    /* Get selected WORKPIECE object in ONT */
    UF_CALL(UF_UI_ONT_ask_selected_nodes( &object_count, &objects ));




    if (object_count == 1) {
      UF_CALL(UF_OBJ_ask_type_and_subtype (objects,&type,&subtype));




      if ((type == UF_machining_geometry_grp_type) && (subtype == UF_mill_geom_featr_subtype) ) {


            tag_t ObjectTag = NULL_TAG;


            // Get the object from the WORKPIECE tag
            CAM::FeatureGeometry *WP = (CAM::FeatureGeometry *)NXObjectManager::Get(objects);


            CAM::MillGeomBuilder *millGeomBuilder1;
            millGeomBuilder1 = workPart->CAMSetup()->CAMGroupCollection()->CreateMillGeomBuilder(WP);


            // Get geometry set list
            CAM::GeometrySetList *pGeomSetList = millGeomBuilder1->PartGeometry()->GeometryList();
            std::vector<CAM::GeometrySet*> geomSetVec = pGeomSetList->GetContents();


            // get geometry set
            std::vector<CAM::GeometrySet*>::iterator iter;
            for ( iter=geomSetVec.begin(); iter != geomSetVec.end(); iter++ )
            {
                CAM::GeometrySet* geomSet = dynamic_cast<CAM::GeometrySet*>(*iter);
                ScCollector *scCollector = geomSet->ScCollector();            
                std::vector<SelectionIntentRule*> rules;
                scCollector->GetRules(rules);


                //get selection rule
                std::vector<SelectionIntentRule*>::iterator ruleIter;
                for ( ruleIter=rules.begin(); ruleIter != rules.end(); ruleIter++ )
                {
                  SelectionIntentRule* selRule = dynamic_cast<SelectionIntentRule*>(*ruleIter);
                  NXOpen::SelectionIntentRule::RuleType ruleType = selRule->Type();
                  //there are different rule types, here just use body, face as sample
                  switch ( ruleType )
                  {
                        case NXOpen::SelectionIntentRule::RuleTypeBodyDumb:
                        {
                            //get bodies
                            NXOpen::BodyDumbRule *bodyRule = dynamic_cast<BodyDumbRule*>(selRule);
                            std::vector<Body*> bodies;
                            bodyRule->GetData(bodies);
                            std::vector<Body*>::iterator bIter;
                            int index = 1;
                            for (bIter=bodies.begin(); bIter!=bodies.end(); bIter++ )
                            {
                              Body* body = dynamic_cast<Body*>(*bIter);
                              ObjectTag = body->GetTag();
                              sprintf(mesg,"the geometry object type is body, the index is %d and the tag is %d\n",index, ObjectTag);                              
                              WRITE(mesg);
                              body->Highlight();
                              index++;
                            }
                        }
                        break;


                        case NXOpen::SelectionIntentRule::RuleTypeFaceDumb:
                        {
                            //get faces
                            NXOpen::FaceDumbRule *faceRule = dynamic_cast<FaceDumbRule*>(selRule);
                            std::vector<Face*> faces;
                            faceRule->GetData(faces);
                            std::vector<Face*>::iterator fIter;
                            int index = 1;
                            for (fIter=faces.begin(); fIter!=faces.end(); fIter++ )
                            {
                              Face* face = dynamic_cast<Face*>(*fIter);
                              ObjectTag = face->GetTag();
                              sprintf(mesg,"the geometry object type is face, the index is %d and the tag is %d\n",index, ObjectTag);                              
                              WRITE(mesg);
                              index++;
                            }
                        }
                        break;


                  default:
                        break;
                  }
                }
            }






            millGeomBuilder1->Destroy();


      } else {
            WRITE("type is not UF_machining_geometry_grp_type");
            WRITE(" or UF_mill_geom_featr_subtype");
      }
      UF_free(objects);


    } else {
      WRITE("The number of selected objects in ONT must be 1.");
    }


}

页: [1]
查看完整版本: NXOpen C++ CAM二次开发:获取workpiece的所有几何Tag值