ProError CSDMdlMachFeaMinSizeCheck::GeoFeaVisitAction(ProFeature *pFeature, ProError status, ProAppData data)
{
	FeaMinSizeVisitData& VisitData = *(FeaMinSizeVisitData*)data;
	double dProp = VisitData.dMinSizeRatio;

	ProSolid CheckedSolid;
	status = ProFeatureSolidGet(pFeature, &CheckedSolid);

	double dMdlMaxSize;
	GetSolidMaxSize(CheckedSolid, dMdlMaxSize);

	vector<vector<double>>arrValues;

	status = ProFeatureGeomitemVisit(pFeature,PRO_SURFACE,
		FeaMinSizeGeomitemVisitAction,
		NULL,&arrValues);

	int nPointCount = (int)arrValues.size();

	vector<double>arrDimValuesL;
	vector<double>arrDimValuesW;
	vector<double>arrDimValuesH;

	if (nPointCount == 0)
	{
		return PRO_TK_NO_ERROR;
	}

	for (int i = 0; i < nPointCount; i++)
	{
		arrDimValuesL.push_back(arrValues[i][0]);
		arrDimValuesW.push_back(arrValues[i][1]);
		arrDimValuesH.push_back(arrValues[i][2]);
	}

	double BoundValueL[2];
	double BoundValueW[2];
	double BoundValueH[2];
	GetMaxMinValues(arrDimValuesL, BoundValueL);
	GetMaxMinValues(arrDimValuesW, BoundValueW);
	GetMaxMinValues(arrDimValuesH, BoundValueH);
	
	vector<double>arrDimValues;
	arrDimValues.push_back(BoundValueL[0] - BoundValueL[1]);
	arrDimValues.push_back(BoundValueW[0] - BoundValueW[1]);
	arrDimValues.push_back(BoundValueH[0] - BoundValueH[1]);

	if ((arrDimValues[0]/dMdlMaxSize) < dProp && (arrDimValues[1]/dMdlMaxSize) < dProp && 
		(arrDimValues[2]/dMdlMaxSize) < dProp)
	{
		VisitData.nFeaMinSizeResultType = CHECK_RESULT_INVALID_VALUE;

		int nErrorSize = (int)VisitData.arrFeaMinSizeErrorIDs.GetSize();

		if (0 != nErrorSize)
		{
			for (int k=0; k<nErrorSize; k++)
			{
				if (VisitData.arrFeaMinSizeErrorIDs[k] == (*pFeature).id)
				return PRO_TK_NO_ERROR;
			}
		}
		VisitData.arrFeaMinSizeErrorIDs.Add((*pFeature).id);
	}
	return PRO_TK_NO_ERROR;
}
Beispiel #2
0
/*====================================================================*\
    FUNCTION :	ProUtilFeatureDump()
    PURPOSE  :	To write a decription of a feature to a text file
\*====================================================================*/
void ProUtilFeatureDump(
    ProModelitem *feature,
    FILE *fp)
{
    ProError status;
    ProSolid owner;
    ProAsmcomppath path;
    ProModelitem modelitem;    
    int n_children, c, n_parents, p;
    ProPatternStatus pstatus;
    ProGrppatternStatus gpstatus;
    ProFeatStatus fstatus;
    ProGroupStatus gstatus;
    ProSelection selection;
    char model_name[PRO_NAME_SIZE], model_type[PRO_NAME_SIZE];
    int m;
    ProFeattype ftype;
    char ftype_str[PRO_NAME_SIZE];
    int *children_ids, *parents_ids;
    ProBoolean is_nc_seq;
    ProWVerstamp stamp;
    char* p_stamp_string;

/*--------------------------------------------------------------------*\
    Check the feature owner
\*--------------------------------------------------------------------*/
    status = ProModelitemMdlGet(feature, (ProMdl *) &owner);
    TEST_CALL_REPORT("ProModelitemMdlGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProUtilModelnameGet((ProMdl*)&owner, model_name,  model_type);
    ProTKFprintf(fp,"Owner     : %s.%s\n", model_name, model_type);

/*--------------------------------------------------------------------*\
    Check the feature owner
\*--------------------------------------------------------------------*/
    status = ProFeatureSolidGet(feature, &owner);
    TEST_CALL_REPORT("ProFeatureSolidGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProUtilModelnameGet((ProMdl*)&owner, model_name,  model_type);
    ProTKFprintf(fp,"Sld Owner : %s.%s\n", model_name, model_type);

/*--------------------------------------------------------------------*\
    Get the list of children of the selected feature
\*--------------------------------------------------------------------*/
    status = ProFeatureChildrenGet(feature, &children_ids, &n_children);
    TEST_CALL_REPORT("ProFeatureChildrenGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "Children : ");
    for(c=0; c<n_children; c++)
	ProTKFprintf(fp,"%d ", children_ids[c]);
    ProTKFprintf(fp,"\n");

/*--------------------------------------------------------------------*\
    Get the list of parents of the selected feature
\*--------------------------------------------------------------------*/
    status = ProFeatureParentsGet(feature, &parents_ids, &n_parents);
    TEST_CALL_REPORT("ProFeatureParentsGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "Parents  : ");
    for(p=0; p<n_parents; p++)
	ProTKFprintf(fp,"%d ", parents_ids[p]);
    ProTKFprintf(fp,"\n");

/*--------------------------------------------------------------------*\
    Get the version stamp of the specified feature
\*--------------------------------------------------------------------*/
    status = ProVerstampAlloc( &stamp );
    TEST_CALL_REPORT("ProVerstampAlloc()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    status = ProFeatureVerstampGet( feature, &stamp );
    TEST_CALL_REPORT("ProFeatureVerstampGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    status = ProVerstampStringGet( stamp, &p_stamp_string );
    TEST_CALL_REPORT("ProVerstampStringGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    
    ProTKFprintf( fp,"Version stamp: %s\n", p_stamp_string );

    status = ProVerstampStringFree( &p_stamp_string );
    TEST_CALL_REPORT("ProVerstampStringFree()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    status = ProVerstampFree( &stamp );
    TEST_CALL_REPORT("ProVerstampFree()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);

/*--------------------------------------------------------------------*\
    Get the feature status
\*--------------------------------------------------------------------*/
    status = ProFeatureStatusGet(feature, &fstatus);
    TEST_CALL_REPORT("ProFeatureStatusGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "FEATURE STATUS       ");
    switch(fstatus)
    {
    case PRO_FEAT_INVALID:
	ProTKFprintf(fp, "Invalid\n");
	break;
    case PRO_FEAT_ACTIVE:
	ProTKFprintf(fp, "Active\n");
	break;
    case PRO_FEAT_INACTIVE:
	ProTKFprintf(fp, "Inactive\n");
	break;
    case PRO_FEAT_FAMTAB_SUPPRESSED:
	ProTKFprintf(fp, "Famtab suppressed\n");
	break;
    case PRO_FEAT_SIMP_REP_SUPPRESSED:
	ProTKFprintf(fp,"Simprep suppressed\n");
	break;
    case PRO_FEAT_PROG_SUPPRESSED:
	ProTKFprintf(fp,"Pro/PROGRAM suppressed\n");
	break;
    case PRO_FEAT_SUPPRESSED:
	ProTKFprintf(fp, "Suppressed\n");
	break;
    case PRO_FEAT_UNREGENERATED:
	ProTKFprintf(fp, "Unregenerated\n");
	break;
    default:
	ProTKFprintf(fp, "**UNKNOWN**\n");
	break;
    }

/*--------------------------------------------------------------------*\
    Get the group status of the feature
\*--------------------------------------------------------------------*/
    status = ProFeatureGroupStatusGet( feature, &gstatus );
    TEST_CALL_REPORT("ProFeatureGroupStatusGet()", "ProUtilFeatureDump()",
                                        status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "GROUP STATUS       ");
    switch(gstatus)
    {
    case PRO_GROUP_INVALID:
	ProTKFprintf(fp, "Invalid\n");
	break;
    case PRO_GROUP_NONE:
	ProTKFprintf(fp, "None\n");
	break;
    case PRO_GROUP_MEMBER:
	ProTKFprintf(fp, "Group member\n");
	break;
    default:
	ProTKFprintf(fp, "**UNKNOWN**\n");
	break;
    }

/*--------------------------------------------------------------------*\
    Get the pattern status of the feature
\*--------------------------------------------------------------------*/
    status = ProFeaturePatternStatusGet(feature, &pstatus);
    TEST_CALL_REPORT("ProFeaturePatternStatusGet()", "ProUtilFeatureDump()",
                                        status, status != PRO_TK_NO_ERROR);
    status = ProFeatureGrppatternStatusGet(feature, &gpstatus);
    TEST_CALL_REPORT("ProFeatureGrppatternStatusGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
    ProTKFprintf(fp, "PATTERN STATUS       ");
    switch(pstatus)
    {
    case PRO_PATTERN_LEADER:
	ProTKFprintf(fp, "Leader of a feature pattern\n");
	break;
    case PRO_PATTERN_MEMBER:
	ProTKFprintf(fp, "Member of a feature pattern\n");
	break;
    default:
	break;
    }
    switch(gpstatus)
    {
    case PRO_GRP_PATTERN_LEADER:
        ProTKFprintf(fp, "Leader of a group pattern\n");
        break;
    case PRO_GRP_PATTERN_MEMBER:
        ProTKFprintf(fp, "Member of a group pattern\n");
        break;
    case PRO_GRP_PATTERN_NONE:
        if (pstatus == PRO_PATTERN_NONE)
            ProTKFprintf(fp, "Not a pattern member\n");
        break;
    default:
        break;
    }

/*--------------------------------------------------------------------*\
    Get elements info. 
\*--------------------------------------------------------------------*/
    ProUtilFeatureElementsDump( feature, fp);

/*--------------------------------------------------------------------*\
    Find whether the feature is an NC sequence
\*--------------------------------------------------------------------*/
    status = ProFeatureIsNcseq(feature, &is_nc_seq);

   if ( is_nc_seq == PRO_B_TRUE )
	ProTKFprintf(fp, "Feature is an NC Sequence\n");
    TEST_CALL_REPORT("ProFeatureIsNcseq()", "ProUtilFeatureDump()",
				PRO_TK_NO_ERROR, status != PRO_TK_NO_ERROR);

/*--------------------------------------------------------------------*\
    Find out whether the feature is created in an assembly
\*--------------------------------------------------------------------*/
    status = ProFeatureSelectionGet(feature, &selection);
    TEST_CALL_REPORT("ProFeatureSelectionGet()", "ProUtilFeatureDump()",
				    status, ((status != PRO_TK_NO_ERROR) &&
					     (status != PRO_TK_BAD_CONTEXT) &&
					     (status != PRO_TK_E_NOT_FOUND)));
    if(!(status == PRO_TK_BAD_CONTEXT))
    if(status == PRO_TK_E_NOT_FOUND)
    {
	ProTKFprintf(fp,"ASSEMBLY REFERENCES :\n");
	ProTKFprintf(fp," (Assembly is not in session)\n");
    }
    else if(status == PRO_TK_NO_ERROR)
    {
	ProTKFprintf(fp,"ASSEMBLY REFERENCES :\n");
	
	status = ProSelectionAsmcomppathGet(selection, &path);
	TEST_CALL_REPORT("ProSelectionAsmcomppathGet()", "ProUtilFeatureDump()",
			 status, status != PRO_TK_NO_ERROR);

	status = ProSelectionModelitemGet(selection, &modelitem);
	TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProUtilFeatureDump()",
			 status, status != PRO_TK_NO_ERROR);
	
/*--------------------------------------------------------------------*\
	Assembly name
\*--------------------------------------------------------------------*/

	ProUtilModelnameGet((ProMdl*)&path.owner, model_name,  model_type);
	ProTKFprintf(fp,"    Owning model : %s.%s\n", model_name, model_type);

/*--------------------------------------------------------------------*\
	Feature id and type
\*--------------------------------------------------------------------*/
	status = ProFeatureTypeGet(&modelitem, &ftype);
	TEST_CALL_REPORT("ProFeatureTypeGet()", "ProUtilFeatureDump()",
					status, status != PRO_TK_NO_ERROR);
	ProUtilFeattypeStr(ftype, ftype_str);
	ProTKFprintf(fp,"    Feature      : %d, type %s\n", modelitem.id, ftype_str);

/*--------------------------------------------------------------------*\
	Component id table
\*--------------------------------------------------------------------*/
	if (path.table_num > 0)
	{
	    ProTKFprintf(fp,"    comp_id_table   ");	    
	    for(m=0; m<path.table_num; m++)
	        ProTKFprintf(fp,"%d", path.comp_id_table[m]);
	    ProTKFprintf(fp, "\n");
	}
	
    }
}