Exemplo n.º 1
0
/*===============================================================*\
FUNCTION : ProUtilFeatCreate
PURPOSE  : Creates feature in no mode option
returns : 
PRO_TK_NO_ERROR - Successfully executed
\*===============================================================*/
ProError ProUtilFeatCreate(ProAsmcomppath *p_comp_path ,ProMdl model, 
                           ProElement pro_e_feature_tree, 
                           ProFeature *feature)
{
    ProError status = PRO_TK_GENERAL_ERROR;
    ProSelection model_sel;
    ProModelitem model_item;
    ProErrorlist p_errors;
    ProFeatureCreateOptions no_mode_option[1];
    int no_opts = 1;
    no_mode_option[0]  = PRO_FEAT_CR_NO_OPTS;
    status = ProMdlToModelitem( model, &model_item ); 
    TEST_CALL_REPORT("ProMdlToModelitem", "ProUtilFeatCreate", 
			status, status != PRO_TK_NO_ERROR );
    status = ProSelectionAlloc (p_comp_path, &model_item, &model_sel);
    status = ProFeatureCreate (model_sel, pro_e_feature_tree, 
       no_mode_option, no_opts, feature, &p_errors); 
    TEST_CALL_REPORT("ProFeatureCreate", "ProUtilFeatCreate", 
			status, status != PRO_TK_NO_ERROR ); 
    ProSelectionFree(&model_sel);
    return status;
}
// 检查函数
int CSDMdlAttrFeaSystemCheck::CheckAction(void *pData, const CheckRule &checkRule, CheckResult &checkResult)
{
	ProMdl pMdl = (ProMdl)pData;
	if (NULL == pMdl)
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	if (!IsMdlTypeValid(pMdl, checkRule.dwMdlFilter))
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	// 检查输入值有效性
	if (checkRule.arrRuleContent.GetSize() < 1)
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_INPUT;
		return checkResult.nResultType;
	}

	ProError status;
	checkResult.nResultType = CHECK_RESULT_NO_ERROR;
	checkResult.arrErrorItems.RemoveAll();

	ProModelitem mdlItem;
	ProMdlToModelitem(pMdl, &mdlItem);

	CString strFeaType, strFeaName;
	NameFeaVisitData visitData;
	ErrorItem errItem;
	CStringArray arrFeatures;
	CStringToCStringArray(checkRule.arrRuleContent[0], arrFeatures);
	for (int i=0; i<(int)arrFeatures.GetSize(); i++)
	{
		strFeaType = arrFeatures[i].Left(arrFeatures[i].Find(L"("));
		int nCount = arrFeatures[i].Find(L")") - arrFeatures[i].Find(L"(")-1;
		strFeaName = arrFeatures[i].Mid(arrFeatures[i].Find(L"(") + 1, nCount);

		ParseParaValue(mdlItem, strFeaName, strFeaName);
		strFeaName.MakeUpper();

		int nFeaType=-1, nSubType=-1;
		GetFeatTypeAndSubType(strFeaType, nFeaType, nSubType);

		visitData.strCheckContent = strFeaName;
		visitData.nFeaType = nFeaType;
		visitData.nSubType = nSubType;

		status = ProSolidFeatVisit((ProSolid)pMdl,
			FeatureNameVisit,
			FeatureNameFilter,
			&visitData);

		if (status != PRO_TK_USER_ABORT)
		{
			checkResult.nResultType = CHECK_RESULT_INVALID_VALUE;
			errItem.nType = visitData.nFeaType;
			errItem.strItemName = visitData.strCheckContent;
			checkResult.arrErrorItems.Add(errItem);
		}
	}
	return checkResult.nResultType;
}
Exemplo n.º 3
0
// 加载包覆对象
void OnLoadSolidActFn()
{
	/*if (!QuickCheckValidLicense(SMART_PROFESSIONAL))
		return;*/

	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	DestroyAllDialog();
	CancelSelectDialog();
	Sleep(50);

	// 选择一个本地的待包覆模型
	ProPath pathSelModel;
	if (ProFileOpen(L"选择待包覆模型", L"*.prt,*.asm,*.stp,*.stl", NULL, NULL, NULL, NULL, pathSelModel) == PRO_TK_NO_ERROR)
	{
		ProPath pathFolder;
		ProName nameModel, nameExt;
		int nVersion;
		ProFilenameParse(pathSelModel, pathFolder, nameModel, nameExt, &nVersion);

		ProMdl pMdlToCoating;
		if (CString(nameExt).CompareNoCase(L"stp") == 0 || CString(nameExt).CompareNoCase(L"step") == 0)
		{
			LoadStep(CString(pathSelModel), pMdlToCoating);
		}
		else
		{
			ProMdlLoad(pathSelModel, PRO_MDL_UNUSED, PRO_B_FALSE, &pMdlToCoating);
		}


		// 创建一个装配体
		CString strSolidName;
		strSolidName = nameModel;

		strSolidName.Format(L"%s_3DCoat", strSolidName);

		ProName nameSolid;
		wcsncpy_s(nameSolid, PRO_NAME_SIZE, strSolidName, _TRUNCATE);

		ProSolid solid;
		ProSolidCreate(nameSolid, PRO_ASSEMBLY, &solid);

		// 创建默认坐标系
		ProError status;
		ProElement elemTree = NULL;
		ProElementAlloc(PRO_E_FEATURE_TREE, &elemTree);
		{
			// 特征类型PRO_E_FEATURE_TYPE
			ProElement elemType;
			status = ProElementAlloc(PRO_E_FEATURE_TYPE, &elemType);
			status = ProElemtreeElementAdd(elemTree, NULL, elemType);
			ProValueData valdataType;
			valdataType.type = PRO_VALUE_TYPE_INT;
			valdataType.v.i = PRO_FEAT_CSYS;
			ProValue valueType = NULL;
			status = ProValueAlloc(&valueType);
			status = ProValueDataSet(valueType, &valdataType);
			status = ProElementValueSet(elemType, valueType);
		}
		ProModelitem itemAssmble;
		ProMdlToModelitem(ProAssemblyToMdl(solid), &itemAssmble);
		ProSelection selAssmble;
		ProSelectionAlloc(NULL, &itemAssmble, &selAssmble);

		ProErrorlist errorsList;
		ProFeatureCreateOptions opts[1] = {PRO_FEAT_CR_NO_OPTS};
		ProFeature feat;
		status = ProFeatureCreate(selAssmble, elemTree, opts, 1, &feat, &errorsList);


		// 将选择的待装配模型装配到装配体下
		ProMatrix initPos = {
			{1.0, 0.0, 0.0, 0.0},
			{0.0, 1.0, 0.0, 0.0},
			{0.0, 0.0, 1.0, 0.0},
			{0.0, 0.0, 0.0, 1.0}
		};
		ProAsmcomp comp;
		ProAsmcompAssemble(ProAssembly(solid), ProMdlToSolid(pMdlToCoating), initPos, &comp);
		ProAsmcompconstraint compConstr;
		ProAsmcompconstraintAlloc(&compConstr);
		ProAsmcompconstraintTypeSet(compConstr, PRO_ASM_DEF_PLACEMENT);
		ProAsmcompconstraint* compConstrs;
		ProArrayAlloc (0, sizeof (ProAsmcompconstraint), 1, (ProArray*)&compConstrs);
		status = ProArrayObjectAdd ((ProArray*)&compConstrs, -1, 1, &compConstr);
		ProAsmcompConstraintsSet(NULL, &comp, compConstrs);

		ProMdlDisplay(solid);
		int nWnd;
		ProWindowCurrentGet(&nWnd);
		ProWindowActivate(nWnd);
	}

	InvalidateDrawing();
	ProMessageClear();
}
Exemplo n.º 4
0
// 生成包覆体
void OnCreateBodyActFn()
{
	/*if (!QuickCheckValidLicense(SMART_PROFESSIONAL))
		return;*/

	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	DestroyAllDialog();
	CancelSelectDialog();
	Sleep(50);

	// 检查当前模型环境
	ProMdl pMdl = GetCurrentMdl();
	if (pMdl == NULL)
	{
		MessageBox(NULL, L"当前环境未发现模型!", L"提示", MB_OK|MB_ICONWARNING);
		return;
	}

	ProMdlType typeMdl;
	ProMdlTypeGet(pMdl, &typeMdl);
	if (typeMdl != PRO_MDL_ASSEMBLY)
	{
		MessageBox(NULL, L"该功能仅在装配环境下有效!", L"提示", MB_OK|MB_ICONWARNING);
		return;
	}

	//ExportElemTreeXML();

	// 选择一个面组
	vector<ProSelection> arrSelQlt;
	ShowMessageTip(L"Tips.选择要加厚的包覆面...");
	if (SelectObject(arrSelQlt, "dtmqlt"))
	{
		// 输入整体加厚值
		double dThickValue;
		ShowMessageTip(L"指定厚度值,不能为0,负值表示向内加厚:");
		if (ProMessageDoubleRead(NULL, &dThickValue) == PRO_TK_NO_ERROR)
		{
			// 创建发布几何
			int nPubFeatID = CreatePublishGeom(pMdl, arrSelQlt[0]);

			ProName nameAsm;
			ProMdlNameGet(pMdl, nameAsm);
			CString strNamePart = nameAsm;
			ProName namePart;
			for (int i=101; ;i++)
			{
				CString strTemp;
				strTemp.Format(L"%s_%d", nameAsm, i);
				wcsncpy_s(namePart, PRO_NAME_SIZE, strTemp, _TRUNCATE);
				ProMdl pMdlTemp;
				if (ProMdlInit(namePart, PRO_MDL_PART, &pMdlTemp) == PRO_TK_E_NOT_FOUND)
					break;
			}

			// 新建一个零件
			ProAsmcomp compPart;
			ProAsmcompCreateCopy(ProMdlToAssembly(pMdl), namePart, PRO_MDL_PART, NULL, PRO_B_FALSE, &compPart);
			//ProSolidRegenerate(pMdl);
			ProMdl pMdlPart;
			ProAsmcompMdlGet(&compPart, &pMdlPart);

			ProModelitem itemAsm;
			ProMdlToModelitem(pMdl, &itemAsm);
			ProSelection selAsm;
			ProSelectionAlloc(NULL, &itemAsm, &selAsm);

			ProFeature featPub;
			featPub.id = nPubFeatID;
			featPub.owner = pMdl;
			featPub.type = PRO_FEATURE;
			ProSelection selPubFeat;
			ProSelectionAlloc(NULL, &featPub, &selPubFeat);

			// 创建复制几何
			ProModelitem itemCopyQuilt;
			CreateCopyGeom(pMdlPart, selAsm, selPubFeat, itemCopyQuilt);
			ProSelection selCopyQuilt;
			ProSelectionAlloc(NULL, &itemCopyQuilt, &selCopyQuilt);

			// 弹出提示:是否要对单个面设置厚度
			if (MessageBox(NULL, L"是否要对单个面设置厚度", L"提示", MB_YESNO|MB_ICONQUESTION) == IDYES)
			{
				ProMdlDisplay(pMdlPart);
				int nWndIDPart;
				ProMdlWindowGet(pMdlPart, &nWndIDPart);
				ProWindowActivate(nWndIDPart);

				// 弹出对话框
				if (g_pDlgThick != NULL)
				{
					if (g_pDlgThick->GetSafeHwnd() != NULL)
						g_pDlgThick->DestroyWindow();

					SAFE_DELETE_POINTER(g_pDlgThick);
				}
				g_pDlgThick = new CDlgSetThick();
				g_pDlgThick->InitSurfData(pMdl, selCopyQuilt, dThickValue);
				g_pDlgThick->Create(IDD_DLG_SETTHICK);
				g_pDlgThick->ShowWindow(SW_SHOW);
			}
			else
			{
				ThickQuilt(pMdlPart, selCopyQuilt, dThickValue);
			}
		}
	}

	InvalidateDrawing();
	ProMessageClear();
}
Exemplo n.º 5
0
// 检查开始,传出检查结果
int CSDMdlAttrMatDensCheck::CheckAction(void *pData, const CheckRule &checkRule, CheckResult &checkResult)
{
	// 检查模型句柄有效性
	ProMdl pMdl = (ProMdl)pData;
	if (NULL == pMdl)
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	// 检查模型类型有效性
	if (!IsMdlTypeValid(pMdl, checkRule.dwMdlFilter))
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	// 检查输入值有效性
	if (checkRule.arrRuleContent.GetCount() < 1)
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_INPUT;
		return checkResult.nResultType;
	}

	// 解析材料和密度对应表
	CStringArray arrItems;
	CStringToCStringArray(checkRule.arrRuleContent[0], arrItems);
	MdlMatDensArray arrMatDens;
	for (int i = 0; i < arrItems.GetSize(); i ++)
	{
		MdlMatDens tempMatDens;
		tempMatDens.strMatName = arrItems[i].Left(arrItems[i].Find(L"("));
		int nCount = arrItems[i].Find(L")") - arrItems[i].Find(L"(") - 1;
		tempMatDens.dDens = _wtof(arrItems[i].Mid(arrItems[i].Find(L"(") + 1, nCount));
		arrMatDens.Add(tempMatDens);
	}

	// 判断是否使用材料关联参数
	BOOL bUsePara = FALSE;
	CString strParaName;
	if (checkRule.arrRuleContent.GetCount() >=2)
	{
		strParaName = checkRule.arrRuleContent[1];
		if (strParaName.CompareNoCase(L"") != 0)
			bUsePara = TRUE;
	}

	ProError status;
	ErrorItem errItem;
	// 获取当前材料名称、密度值和单位
	CString strMatName;
	double dScale, dDensity;
	if (bUsePara)
	{
		ProModelitem mdlItem;
		ProMdlToModelitem(pMdl, &mdlItem);
		if (!GetSDParameter(&mdlItem, strParaName, strMatName, FALSE))
		{
			checkResult.nResultType = CHECK_RESULT_ITEM_NOT_FOUND;
			return CHECK_RESULT_ITEM_NOT_FOUND;
		}
		ProParameter para;
		GetSDParameter(&mdlItem, L"MP_DENSITY", para, NULL);
		ProParamvalue paraValue;
		ProParameterValueGet(&para, &paraValue);
		ProUnititem unit;
		ProParameterUnitsGet(&para, &unit);
		ProPath expression;
		ProUnitExpressionGet(&unit, expression);
		dScale = GetConvertFactor(CString(expression));
		dDensity = paraValue.value.d_val*dScale;
	}
	else
	{
		// 能否获取材料密度
		ProMaterial mdlMat;
		if (ProMaterialCurrentGet(ProMdlToSolid(pMdl), &mdlMat) != PRO_TK_NO_ERROR)
		{
			checkResult.nResultType = CHECK_RESULT_ITEM_NOT_FOUND;
			return CHECK_RESULT_ITEM_NOT_FOUND;
		}
		strMatName = mdlMat.matl_name;
		/*ProMaterialdata matdata;
		ProMaterialDataGet(&mdlMat, &matdata);
		double dDensity = matdata.mass_density;*/
		ProMaterialItem matItem;
		status = ProModelitemByNameInit(pMdl, PRO_RP_MATERIAL, mdlMat.matl_name, &matItem);
		
		ProParamvalue val;
		ProUnititem mdlUnit;
		if (ProMaterialPropertyGet(&matItem, PRO_MATPROP_MASS_DENSITY, &val, &mdlUnit) != PRO_TK_NO_ERROR)
		{
			checkResult.nResultType = CHECK_RESULT_UNKNOWN_ERROR;
			return CHECK_RESULT_UNKNOWN_ERROR;
		}
		ProPath expression;
		ProUnitExpressionGet(&mdlUnit, expression);
		dScale = GetConvertFactor(CString(expression));
		dDensity = val.value.d_val*dScale;
	}
	
	checkResult.arrErrorItems.RemoveAll();
	checkResult.nResultType = CHECK_RESULT_INVALID_VALUE;
	errItem.strItemName = strMatName;
	checkResult.arrErrorItems.Add(errItem);
	errItem.strItemName.Format(L"%g", dDensity);
	checkResult.arrErrorItems.Add(errItem);
	errItem.strItemName.Format(L"%g", dScale);
	checkResult.arrErrorItems.Add(errItem);

	for (int i = 0; i< arrMatDens.GetCount(); ++i)
	{
		// 匹配材料名
		if (strMatName.CompareNoCase(arrMatDens[i].strMatName) == 0)
		{
			errItem.strItemName.Format(L"%g", arrMatDens[i].dDens);
			checkResult.arrErrorItems.Add(errItem);

			// 检查密度值
			if (ISDNEAR(arrMatDens[i].dDens, dDensity))
			{
				checkResult.nResultType = CHECK_RESULT_NO_ERROR;
			}
			else
			{
				checkResult.nResultType = CHECK_RESULT_ERROR_VALUE;
			}
			return checkResult.nResultType;
		}
	}
	return CHECK_RESULT_INVALID_VALUE;
}
Exemplo n.º 6
0
ProError SetParametricParameter(  
				e_force             force,
				const std::string	&in_model_name,
				ProMdl				*in_p_model, 
				const std::string   in_ParameterName,
				e_CADParameterType	in_ParameterType,
				const std::string   in_ParameterValue)
									throw (isis::application_exception)
{
	ProError result = PRO_TK_NO_ERROR; 
	std::stringstream msg("SetParametricParameter: (force) ");

	
	
	
	isis_LOG(lg, isis_FILE, isis_INFO) <<  "  SetParametricParameter CADParameter" 
		<< isis_EOL <<  "      Force          "  <<  force
		<< isis_EOL <<  "      Model Name     "  <<  in_model_name 
		<< isis_EOL <<  "      Model Handle   "  <<  in_p_model
		<< isis_EOL <<  "      Type           "  <<  in_ParameterType 
		<< isis_EOL <<  "      Name           "  <<  in_ParameterName
		<< isis_EOL <<  "      Value          "  <<  in_ParameterValue;

	if (in_p_model == NULL) {
		isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << "null model handle";
		return PRO_TK_BAD_INPUTS;
	}

	isis_LOG(lg, isis_FILE, isis_INFO) << "SetParametricParameter : Set up the parameter"; 
	if ( in_ParameterName.size() >= PRO_NAME_SIZE ) {
		msg << "Exceeded maximum number of characters : "
		    << "Parameter Name: " << in_ParameterName << ", Maximum allowed characters: " << (PRO_NAME_SIZE - 1);
		isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
		throw isis::application_exception("C01001", msg);
	}

	ProName parameter_key;
	ProStringToWstring(parameter_key, const_cast<char *>(in_ParameterName.c_str()) );
	ProParamvalue parameter_value;

	switch ( in_ParameterType ) {
		case CAD_FLOAT:
			parameter_value.type = PRO_PARAM_DOUBLE;
			parameter_value.value.d_val = atof(in_ParameterValue.c_str());
			break;
		case CAD_INTEGER:
			parameter_value.type = PRO_PARAM_INTEGER;
			parameter_value.value.i_val = atoi(in_ParameterValue.c_str());
			break;
		case CAD_BOOLEAN:
			parameter_value.type = PRO_PARAM_BOOLEAN;
			parameter_value.value.l_val = isis::String_To_ProBoolean(in_ParameterValue);
			break;
		case CAD_STRING:
			if ( in_ParameterValue.size() > MAX_STRING_PARAMETER_LENGTH )
			{
				msg << "Erroneous CADParameter string value: "
					    << "Parameter: " <<  CADParameterType_string(in_ParameterType) 
					    << "  Value: " << in_ParameterValue 
						<< ", Value must be " << MAX_STRING_PARAMETER_LENGTH << " characters or less.";
				throw isis::application_exception(msg);
			}
			parameter_value.type = PRO_PARAM_STRING;
			ProStringToWstring(parameter_value.value.s_val, const_cast<char *>(in_ParameterValue.c_str()));
			break;

		default:
			msg << "Erroneous CADParameter Type: "
				<<  CADParameterType_string(in_ParameterType) << ", Should be FLOAT, INTEGER, or BOOLEAN.";
			isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
			throw isis::application_exception(msg);
	}

	ProError status;

	isis_LOG(lg, isis_FILE, isis_INFO) << "SetParametricParameter : get the model-item from the model";
	ProModelitem model_item;
	
	switch ( status = ProMdlToModelitem( *in_p_model, &model_item ) ) {
	case PRO_TK_NO_ERROR: 
		{
			isis_LOG(lg, isis_FILE, isis_INFO) << "The ProMdlToModelitem() was successful.";
			break;
		}
	case PRO_TK_BAD_INPUTS: 
		{
			msg	<< "ProMdlToModelitem: An argument is NULL, "
				<< " model: " << in_p_model 
				<< " model-item: " << model_item;
			isis::application_exception ex(msg);
			isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
			throw ex;
		}
	case PRO_TK_INVALID_PTR: 
		{
			msg << "ProMdlToModelitem: The handle is invalid. ";
			isis::application_exception ex(msg);
			isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
			throw ex;
		}
	}

	isis_LOG(lg, isis_FILE, isis_INFO) << "SetParametricParameter : set the property";
	ProParameter parameter_handle;
    switch ( status = ProParameterInit(&model_item, parameter_key, &parameter_handle) ) {
		case PRO_TK_E_NOT_FOUND:
		{
			switch (force) {
			case FORCE_KEY:
				break;
			case FORCE_VALUE:
				{
					msg << "key is not bound and should not be forced";
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			case FORCE_NEITHER:
				{
					msg << "force neither : not yet implemented";
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			}
			isis_LOG(lg, isis_FILE, isis_INFO) << "The parameter was not found within the owner, so creating new.";
			switch ( status = ProParameterCreate (&model_item, parameter_key, &parameter_value, &parameter_handle ) ) {
			case PRO_TK_NO_ERROR:
				{
						isis_LOG(lg, isis_FILE, isis_INFO) << "ProParameterCreate successfully added the parameter.";
						result = PRO_TK_E_NOT_FOUND;
						break;
				}
			case PRO_TK_BAD_INPUTS:
				{
					msg	<< "One or more of the input arguments to ProParameterCreate() are invalid,"
						<< " key: " << parameter_key 
						<< " param: " << parameter_handle.owner.type;
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			case PRO_TK_BAD_CONTEXT:
				{
					msg << "The owner is nonexistent.";
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			case PRO_TK_E_FOUND:
				{
					msg << "The specified parameter already exists.";
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			case PRO_TK_GENERAL_ERROR: 
				{
					msg << "The function could not add the parameter to the database.";
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			}
		}
	case PRO_TK_NO_ERROR: 
		{
			isis_LOG(lg, isis_FILE, isis_INFO) << "ProParameterInit() successfully initialized the handle.";
			switch (force) {
			case FORCE_KEY:
			case FORCE_VALUE:
				break;
			case FORCE_NEITHER:
				{
					msg << "force neither : not yet implemented";
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			}	
			switch ( status = ProParameterValueSet(&parameter_handle, &parameter_value) ) {
			case PRO_TK_NO_ERROR:
				{
					isis_LOG(lg, isis_FILE, isis_INFO) << "ProParameterValueSet successfully updated the information.";
					result = PRO_TK_NO_ERROR;
					break;
				}
			case PRO_TK_E_NOT_FOUND: 
				{
					msg << "The owner was not found.";
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			case PRO_TK_GENERAL_ERROR: 
				{
					msg << "The parameter was not found, or the function could not perform the action.";
					isis::application_exception ex(msg);
					isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
					throw ex;
				}
			}
			break;
		}
	case PRO_TK_BAD_INPUTS: 
		{
			msg	<< "One or more of the input arguments are invalid,"
				<< " key: " << parameter_key 
				<< " param: " << parameter_handle.owner.type;
			isis::application_exception ex(msg);
			isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
			throw ex;
		}
	case PRO_TK_BAD_CONTEXT: 
		{
			msg << "The owner is nonexistent.";
			isis::application_exception ex(msg);
			isis_LOG(lg, isis_CONSOLE_FILE, isis_ERROR) << msg.str();
			throw ex;
		}
		
	}
	isis_LOG(lg, isis_FILE, isis_INFO) << "SetParametricParameter : COMPLETE";
	return result;
		
}  // end ForceParametricParameter
// 检查开始
int CSDMdlAttrParaKeywordCheck::CheckAction(void *pData, const CheckRule &checkRule, CheckResult &checkResult)
{
	ProMdl pMdl = (ProMdl)pData;
	if (NULL == pMdl)
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	if (!IsMdlTypeValid(pMdl, checkRule.dwMdlFilter))
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	// 模型是否符合过滤器要求
	if (!IsFilterValid(checkRule.strRuleName, pMdl))
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	// 检查输入值有效性
	if (checkRule.arrRuleContent.GetCount() < 1)
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_INPUT;
		return checkResult.nResultType;
	}

	//-----------------------------------------------------------------------------------

	ProModelitem mdlItem;
	ProMdlToModelitem(pMdl, &mdlItem);

	checkResult.arrErrorItems.RemoveAll();

	// 解析参数
	CStringArray arrItems;
	CStringToCStringArray(checkRule.arrRuleContent[0], arrItems, L";");
	CString strParaName;
	CString strKeyword;
	BOOL bDesignation;
	for (int i = 0; i < arrItems.GetSize(); i ++)
	{
		strParaName = arrItems[i].Left(arrItems[i].Find(L"("));
		int nCount = arrItems[i].Find(L")") - arrItems[i].Find(L"(")-1;
		CString strProperty;
		strProperty = arrItems[i].Mid(arrItems[i].Find(L"(") + 1, nCount);
		CStringArray arrPropertys;
		CStringToCStringArray(strProperty, arrPropertys, L",");
		strKeyword = arrPropertys[0];
		ParseParaValue(mdlItem, strKeyword, strKeyword);
		bDesignation = _wtoi(arrPropertys[1]);
		
		ProName paraname;
		wcsncpy_s(paraname, PRO_NAME_SIZE, (LPCTSTR)strParaName, _TRUNCATE);
		ProParameter para;

		// 判断参数是否存在
		ErrorItem item;
		item.strItemName = strParaName;
		item.nID = i;
		CString strValue;
		if (GetSDParameter(&mdlItem, paraname, para))
		{
			// 参数存在,得到字符串参数值
			ProParamvalue paraValue;
			ProParameterValueGet(&para, &paraValue);
			if (paraValue.type == PRO_PARAM_STRING)
			{
				strValue = paraValue.value.s_val;
				if (strValue.Find(strKeyword) < 0)
				{
					item.nType = PARAERROR_VALUE;
					checkResult.arrErrorItems.Add(item);
				}
				else
				{
					// 检查是否指定
					ProBoolean designation;
					ProParameterDesignationVerify(&para, &designation);
					if (bDesignation != designation)
					{
						item.nType = PARAERROR_DESIGNATION;
						checkResult.arrErrorItems.Add(item);
					}
				}
			}
			else	// 参数类型不匹配
			{
				item.nType = PARAERROR_TYPE;
				checkResult.arrErrorItems.Add(item);
			}
		}
		else
		{
			// 参数不存在
			item.nType = PARAERROR_NOEXIST;
			checkResult.arrErrorItems.Add(item);
		}
	}

	if (checkResult.arrErrorItems.GetCount() > 0)
		checkResult.nResultType = CHECK_RESULT_ERROR_VALUE;
	else
		checkResult.nResultType = CHECK_RESULT_NO_ERROR;

	return checkResult.nResultType;
}
// 处理过程
BOOL CSDMdlAttrParaKeywordCheck::DoAction(void *pData, const CheckData &checkData)
{
	ProMdl pMdl = (ProMdl)pData;
	if (NULL == pMdl)
		return FALSE;

	ProModelitem mdlItem;
	ProMdlToModelitem(pMdl, &mdlItem);

	CStringArray arrItems;
	CStringToCStringArray(checkData.checkRule.arrRuleContent[0], arrItems, L";");

	ErrorItemArray arr;
	CStringArray arrFailedPara;	// 修复失败的参数列表
	arr.Copy(checkData.checkResult.arrErrorItems);
	for (int i=0, nIndex=0; i<arr.GetCount(); i++)
	{
		// 获取参数需包含的关键字和是否指定
		CString strKeyword;
		BOOL bDesignation;
		nIndex = arr[i].nID;
		int nCount = arrItems[nIndex].Find(L")") - arrItems[nIndex].Find(L"(")-1;
		CString strProperty;
		strProperty = arrItems[nIndex].Mid(arrItems[nIndex].Find(L"(") + 1, nCount);
		CStringArray arrPropertys;
		CStringToCStringArray(strProperty, arrPropertys, L",");
		strKeyword = arrPropertys[0];
		ParseParaValue(mdlItem, strKeyword, strKeyword);
		bDesignation = _wtoi(arrPropertys[1]);

		// 如果类型不匹配,先删除原参数
		if(arr[i].nType == PARAERROR_TYPE)
		{
			if (!DelSDParameter(&mdlItem, arr[i].strItemName, FALSE))
			{
				arrFailedPara.Add(arr[i].strItemName);
				continue;
			}
		}
		else if (arr[i].nType == PARAERROR_DESIGNATION)
		{
			GetSDParameter(&mdlItem, arr[i].strItemName, strKeyword, FALSE);
		}
		// 创建参数
		if (!SetSDParameter(&mdlItem, arr[i].strItemName, strKeyword, FALSE))
		{
			arrFailedPara.Add(arr[i].strItemName);
			continue;
		}	
		// 修改指定关系
		ProParameter para;
		GetSDParameter(&mdlItem, arr[i].strItemName, para, FALSE);
		if (bDesignation)
		{
			ProParameterDesignationAdd(&para);
		}
		else
			ProParameterDesignationRemove(&para);
	}

	if (arrFailedPara.GetCount() > 0)
	{
		CString strResult;
		strResult.Format(L"%s等%d个参数修复失败,请手动修复", arrFailedPara[0], arrFailedPara.GetCount());
		MessageBox(NULL, strResult, L"提示", MB_OK|MB_ICONINFORMATION);
		return FALSE;
	}

	return TRUE;
}
// 检查开始
int CSDMdlAttrParaSpecifiedValueCheck::CheckAction(void *pData, const CheckRule &checkRule, CheckResult &checkResult)
{
	ProMdl pMdl = (ProMdl)pData;
	if (NULL == pMdl)
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	if (!IsMdlTypeValid(pMdl, checkRule.dwMdlFilter))
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	// 模型是否符合过滤器要求
	if (!IsFilterValid(checkRule.strRuleName, pMdl))
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_MODEL;
		return checkResult.nResultType;
	}

	// 检查输入值有效性
	if (checkRule.arrRuleContent.GetCount() < 1)
	{
		checkResult.nResultType = CHECK_RESULT_INVALID_INPUT;
		return checkResult.nResultType;
	}

	//-----------------------------------------------------------------------------------

	ProModelitem mdlItem;
	ProMdlToModelitem(pMdl, &mdlItem);

	checkResult.arrErrorItems.RemoveAll();

	// 解析参数
	CStringArray arrItems;
	CStringToCStringArray(checkRule.arrRuleContent[0], arrItems, L";");
	CString strParaName;
	int nParaType;
	CString strParaValue;
	BOOL bDesignation;
	for (int i = 0; i < arrItems.GetSize(); i ++)
	{
		strParaName = arrItems[i].Left(arrItems[i].Find(L"("));
		int nCount = arrItems[i].Find(L")") - arrItems[i].Find(L"(")-1;
		CString strProperty;
		strProperty = arrItems[i].Mid(arrItems[i].Find(L"(") + 1, nCount);
		CStringArray arrPropertys;
		CStringToCStringArray(strProperty, arrPropertys, L",");
		nParaType = _wtoi(arrPropertys[0]);
		strParaValue = arrPropertys[1];
		ParseParaValue(mdlItem, strParaValue, strParaValue);
		bDesignation = _wtoi(arrPropertys[2]);
		
		ProName paraname;
		wcsncpy_s(paraname, PRO_NAME_SIZE, (LPCTSTR)strParaName, _TRUNCATE);
		ProParameter para;

		// 判断参数是否存在
		ErrorItem item;
		item.strItemName = strParaName;
		item.nID = i;
		if (GetSDParameter(&mdlItem, paraname, para))
		{
			// 检查参数类型
			ProParamvalue proval;
			ProParameterValueGet(&para, &proval);
			int nType = GetParaType(proval.type);
			if (nType != nParaType)
			{
				item.nType = PARAERROR_TYPE;
				checkResult.arrErrorItems.Add(item);
			}
			else
			{
				// 检查参数值
				if (PARAM_STRING == nParaType)
				{
					if (strParaValue.Compare(proval.value.s_val) != 0)
					{
						item.nType = PARAERROR_VALUE;
						checkResult.arrErrorItems.Add(item);
						continue;
					}
				}
				else if (PARAM_REAL == nParaType)
				{
					if (!DEQUAL(proval.value.d_val, _wtof(strParaValue)))
					{
						item.nType = PARAERROR_VALUE;
						checkResult.arrErrorItems.Add(item);
						continue;
					}
				}
				else if (PARAM_INTEGER == nParaType)
				{
					if (proval.value.i_val != _wtoi(strParaValue))
					{
						item.nType = PARAERROR_VALUE;
						checkResult.arrErrorItems.Add(item);
						continue;
					}
				}
				else if (PARAM_BOOL == nParaType)
				{
					if (proval.value.l_val != _wtoi(strParaValue))
					{
						item.nType = PARAERROR_VALUE;
						checkResult.arrErrorItems.Add(item);
						continue;
					}
				}
				// 检查是否指定
				ProBoolean designation;
				ProParameterDesignationVerify(&para, &designation);
				if (bDesignation != designation)
				{
					item.nType = PARAERROR_DESIGNATION;
					checkResult.arrErrorItems.Add(item);
				}
			}
		}
		else
		{
			item.nType = PARAERROR_NOEXIST;
			checkResult.arrErrorItems.Add(item);
		}
	}

	if (checkResult.arrErrorItems.GetCount() > 0)
		checkResult.nResultType = CHECK_RESULT_ERROR_VALUE;
	else
		checkResult.nResultType = CHECK_RESULT_NO_ERROR;

	return checkResult.nResultType;
}
// 处理过程
BOOL CSDMdlAttrParaSpecifiedValueCheck::DoAction(void *pData, const CheckData &checkData)
{
	ProMdl pMdl = (ProMdl)pData;
	if (NULL == pMdl)
		return FALSE;

	ProModelitem mdlItem;
	ProMdlToModelitem(pMdl, &mdlItem);

	CStringArray arrItems;
	CStringToCStringArray(checkData.checkRule.arrRuleContent[0], arrItems, L";");

	ErrorItemArray arr;
	CStringArray arrFailedPara;	// 修复失败的参数列表
	arr.Copy(checkData.checkResult.arrErrorItems);
	for (int i=0, nIndex=0; i<arr.GetCount(); i++)
	{
		// 获取参数类型和是否指定
		int nParaType;
		BOOL bDesignation;
		CString strParaValue;
		nIndex = arr[i].nID;
		int nCount = arrItems[nIndex].Find(L")") - arrItems[nIndex].Find(L"(")-1;
		CString strProperty;
		strProperty = arrItems[nIndex].Mid(arrItems[nIndex].Find(L"(") + 1, nCount);
		CStringArray arrPropertys;
		CStringToCStringArray(strProperty, arrPropertys, L",");
		nParaType = _wtoi(arrPropertys[0]);
		strParaValue = arrPropertys[1];
		ParseParaValue(mdlItem, strParaValue, strParaValue);
		bDesignation = _wtoi(arrPropertys[1]);

		// 如果类型不匹配,先删除原参数
		if(arr[i].nType == PARAERROR_TYPE)
		{
			if (!DelSDParameter(&mdlItem, arr[i].strItemName, FALSE))
			{
				arrFailedPara.Add(arr[i].strItemName);
				continue;
			}
		}
		else if (arr[i].nType == PARAERROR_DESIGNATION)
		{
			GetSDParameter(&mdlItem, arr[i].strItemName, strParaValue, FALSE);
		}
		
		// 创建参数
		if (PARAM_STRING == nParaType)
		{
			if (!SetSDParameter(&mdlItem, arr[i].strItemName, strParaValue, FALSE))
			{
				arrFailedPara.Add(arr[i].strItemName);
				continue;
			}
		}
		else if (PARAM_REAL == nParaType)
		{
			double dVal = _wtof(strParaValue);
			if (!SetSDParameter(&mdlItem, arr[i].strItemName, dVal, FALSE))
			{
				arrFailedPara.Add(arr[i].strItemName);
				continue;
			}
		}
		else if (PARAM_INTEGER == nParaType)
		{
			int nVal = _wtoi(strParaValue);
			if (!SetSDParameter(&mdlItem, arr[i].strItemName, nVal, FALSE))
			{
				arrFailedPara.Add(arr[i].strItemName);
				continue;
			}
		}
		else if (PARAM_BOOL == nParaType)
		{
			ProBoolean bVal;
			if (_wtoi(strParaValue) == 0)
				bVal = PRO_B_FALSE;
			else
				bVal = PRO_B_TRUE;
			if (!SetSDParameter(&mdlItem, arr[i].strItemName, bVal, FALSE))
			{
				arrFailedPara.Add(arr[i].strItemName);
				continue;
			}
		}
		
		// 修改指定关系
		ProName paraname;
		wcsncpy_s(paraname, PRO_NAME_SIZE, (LPCTSTR)arr[i].strItemName, _TRUNCATE);
		ProParameter para;
		if (GetSDParameter(&mdlItem, paraname, para))
		{
			if (bDesignation)
			{
				ProParameterDesignationAdd(&para);
			}
			else
				ProParameterDesignationRemove(&para);
		}
	}

	if (arrFailedPara.GetCount() > 0)
	{
		CString strResult;
		strResult.Format(L"%s等%d个参数修复失败,请手动修复", arrFailedPara[0], arrFailedPara.GetCount());
		MessageBox(NULL, strResult, L"提示", MB_OK|MB_ICONINFORMATION);
		return FALSE;
	}

	return TRUE;
}