ZW3D二次开发_操作方程式(表达式)

1.ZW3D中的方程式主要分为草图环境方程式和零件环境方程式

草图环境方程式平台功能如下图:

零件环境方程式平台功能如下图:

2.草图环境中使用接口操作方程式如下:
    //添加本地变量
	//添加数字变量
	svxVariable var_num = { 0 };
	strcpy_s(var_num.Name, "数字");//变量名
	var_num.type = evxVarType::VX_VAR_NUM;//变量类型
	strcpy_s(var_num.Expression, "666");//变量值,这样设置没问题
	ZF_CALL(cvxSkVarAdd(&var_num));
	//添加字符串变量
	svxVariable var_string = { 0 };
	strcpy_s(var_string.Name, "字符串");//变量名
	var_string.type = evxVarType::VX_VAR_STR;//变量类型
	strcpy_s(var_string.Expression, "\"字符串值\"");//变量表达式
	ZF_CALL(cvxSkVarAdd(&var_string));
	//添加点变量
	svxVariable var_point = { 0 };
	strcpy_s(var_point.Name, "点");//变量名
	var_point.type = evxVarType::VX_VAR_PNT;//变量类型
	strcpy_s(var_point.Expression, "Point(1,2,3)");//变量表达式
	ZF_CALL(cvxSkVarAdd(&var_point));
	//添加向量变量
	svxVariable var_vector = { 0 };
	strcpy_s(var_vector.Name, "向量");//变量名
	var_vector.type = evxVarType::VX_VAR_VEC;//变量类型
	strcpy_s(var_vector.Expression, "Vector(1,2,3)");//变量表达式
	ZF_CALL(cvxSkVarAdd(&var_vector));
	//添加数字变量,表达式使用当前本地变量
	svxVariable var_num2 = { 0 };
	strcpy_s(var_num2.Name, "数字2");//变量名
	var_num2.type = evxVarType::VX_VAR_NUM;//变量类型
	strcpy_s(var_num2.Expression, "2 * 数字");//变量表达式
	ZF_CALL(cvxSkVarAdd(&var_num2));
	//表达式链接到外部文件的变量
	svxVariable var_external = { 0 };
	strcpy_s(var_external.Name, "外部变量");//变量名
	var_external.type = evxVarType::VX_VAR_STR;//变量类型,必须与要链接的外部变量的类型一致
	strcpy_s(var_external.Expression, "[off-road_vehicle_transfer_case.Z3ASM:字符串]");//变量表达式,格式为:[外部文件名:外部变量名]
	ZF_CALL(cvxSkVarAdd(&var_external));

	//获取指定名称的变量
	svxVariable var = { 0 };
	strcpy_s(var.Name, "数字");//变量名
	ZF_CALL(cvxSkVarGet(&var));
	WriteMessage("方程式[%s]的值为[%f]", var.Name, var.Value);

	//设置指定名称的变量
	strcpy_s(var.Expression, "777");//通过修改变量的表达式来修改变量值
	ZF_CALL(cvxSkVarSet(1, &var));
	WriteMessage("方程式[%s]的值设置为[%s]", var.Name, "777");

	//获取所有变量
	int count = 0;
	svxVariable* pVars = NULL;
	ZF_CALL(cvxSkInqVars(&count, &pVars));
	for (int i = 0; i < count; i++)
	{
		WriteMessage("====================================");
		WriteMessage("Name = %s", pVars[i].Name);
		WriteMessage("Expression = %s", pVars[i].Expression);
	}
	ZF_VOID(cvxMemFree((void**)&pVars));//释放内存
3.零件环境中使用接口操作方程式如下:
    //添加本地变量
	//添加数字变量
	svxVariable var_num = { 0 };
	strcpy_s(var_num.Name, "数字");//变量名
	var_num.type = evxVarType::VX_VAR_NUM;//变量类型
	strcpy_s(var_num.Expression, "666");//变量表达式
	ZF_CALL(cvxPartVarAdd(&var_num));
	//添加字符串变量
	svxVariable var_string = { 0 };
	strcpy_s(var_string.Name, "字符串");//变量名
	var_string.type = evxVarType::VX_VAR_STR;//变量类型
	strcpy_s(var_string.Expression, "\"字符串值\"");//变量表达式
	ZF_CALL(cvxPartVarAdd(&var_string));
	//添加点变量
	svxVariable var_point = { 0 };
	strcpy_s(var_point.Name, "点");//变量名
	var_point.type = evxVarType::VX_VAR_PNT;//变量类型
	strcpy_s(var_point.Expression, "Point(1,2,3)");//变量表达式
	ZF_CALL(cvxPartVarAdd(&var_point));
	//添加向量变量
	svxVariable var_vector = { 0 };
	strcpy_s(var_vector.Name, "向量");//变量名
	var_vector.type = evxVarType::VX_VAR_VEC;//变量类型
	strcpy_s(var_vector.Expression, "Vector(1,2,3)");//变量表达式
	ZF_CALL(cvxPartVarAdd(&var_vector));
	//添加数字变量,表达式使用当前本地变量
	svxVariable var_num2 = { 0 };
	strcpy_s(var_num2.Name, "数字2");//变量名
	var_num2.type = evxVarType::VX_VAR_NUM;//变量类型
	strcpy_s(var_num2.Expression, "2 * 数字");//变量表达式
	ZF_CALL(cvxPartVarAdd(&var_num2));
	//表达式链接到外部文件的变量
	//svxVariable var_external = { 0 };
	//strcpy_s(var_external.Name, "外部变量");//变量名
	//var_external.type = evxVarType::VX_VAR_STR;//变量类型,必须与要链接的外部变量的类型一致
	//strcpy_s(var_external.Expression, "[off-road_vehicle_transfer_case.Z3ASM:字符串]");//变量表达式,格式为:[外部文件名:外部变量名]
	//ZF_CALL(cvxPartVarAdd(&var_external));

	//获取指定名称的变量
	svxVariable var = { 0 };
	strcpy_s(var.Name, "数字");//变量名
	ZF_CALL(cvxPartVarGet(&var));
	WriteMessage("value = %f", var.Value);

	//设置指定名称的变量
	strcpy_s(var.Expression, "777");//通过修改变量的表达式来修改变量值
	ZF_CALL(cvxPartVarSet(1, &var, TRUE));

	//输出方程
	WriteMessage("【SUP-67627】ZW3D_API_方程式管理器_输出_希望添加函数以输出方程式");
	
	//输入方程
	//https://jira.zwcad.com/browse/SUP-67688
	WriteMessage("输入方程 https://jira.zwcad.com/browse/SUP-67688");

	string equationFile = ZF_GetFilePathInThisDirectory("方程式.csv");
	ZF_CALL(cvxEqLoadFile(equationFile.c_str(), evxEqnSetOpt::VX_EQN_AUTO_OVERWRITE_ALL_EQN));

	//获取所有变量
	int count = 0;
	svxVariable* pVars = NULL;
	ZF_CALL(cvxPartInqVars(NULL, NULL, &count, &pVars));
	for (int i = 0; i < count; i++)
	{
		WriteMessage("Name = %s", pVars[i].Name);
		WriteMessage("Expression = %s", pVars[i].Expression);
		WriteMessage("====================================");
	}
	ZF_VOID(cvxMemFree((void**)&pVars));//释放内存

	//创建(空)方程式组	
	ZF_CALL(cvxPartEqnSetWithName("EquationSet", 0, NULL));
	WriteMessage("创建方程式组[EquationSet]");
	//相似接口
	//cvxPartEqnSet

	//获取所有方程式和方程式组
	int equationNumber = 0;
	int *pEquationIds = NULL;
	int equationSetNumber = 0;
	int *pEquationSetIds = NULL;
	ZF_CALL(cvxPartInqEqnAllId(&equationNumber, &pEquationIds, &equationSetNumber, &pEquationSetIds));
	WriteMessage("方程式的数量 = [%d]", equationNumber);
	for (int i = 0; i < equationNumber; i++)
	{
		//获取方程式对应的变量
		svxVariable equVar{};
		ZF_CALL(cvxPartVarGetById(pEquationIds[i], &equVar));
		WriteMessage("方程式[%d]对应的变量的名称 = %s", pEquationIds[i], equVar.Name);

		//获取方程式所在的方程式组
		int idSet = 0;
		ZF_CALL(cvxPartInqEqnAssociatedSet(pEquationIds[i], &idSet));
		WriteMessage("方程式[%d]所在的方程式组 = [%d]", pEquationIds[i], idSet);

		//设置方程式的描述
		ZF_CALL(cvxEqSetDescById(pEquationIds[i], (char*)"方程式描述"));

		//获取方程式的描述
		char equationDescription[128];
		ZF_CALL(cvxEqGetDescById(pEquationIds[i], equationDescription, sizeof(equationDescription)));
		WriteMessage("方程式[%d]对应的描述:%s", pEquationIds[i], equationDescription);

	}
	WriteMessage("方程式组的数量 = [%d]", equationSetNumber);

	//获取方程式组下的方程式
	if (equationSetNumber>1)
	{
		int nSubEquation = 0;
		int* pSubEquation = NULL;
		ZF_CALL(cvxPartInqEqnSetMembers(pEquationSetIds[equationSetNumber-1], &nSubEquation, &pSubEquation));
		WriteMessage("方程式组[%d]下所有方程式的数量为[%d]", pEquationSetIds[equationSetNumber - 1], nSubEquation);
		ZF_VOID(cvxMemFree((void**)&pSubEquation));//释放内存
	}

	//删除变量/方程式
	if (equationNumber > 0)
	{
		ZF_CALL(cvxPartEqnDelete(pEquationIds[0]));
		WriteMessage("删除方程式[%d]", pEquationIds[0]);
	}

	//在方程式组中添加变量
	for (int i = 0; i < equationSetNumber; i++)
	{
		char tempName[128];
		ZF_CALL(cvxEntName(pEquationSetIds[i], tempName, sizeof(tempName)));
		if (strcmp(tempName, "EquationSet") == 0)//找到"EquationSet"方程式组的id
		{
			svxVariable sub_var_num = { 0 };
			strcpy_s(sub_var_num.Name, "方程式组下的数字");//变量名
			sub_var_num.type = evxVarType::VX_VAR_NUM;//变量类型
			strcpy_s(sub_var_num.Expression, "888");//变量表达式

			ZF_CALL(cvxPartVarAddToEqnSet(pEquationSetIds[i], 1, &sub_var_num));//在方程式组中添加变量

			//将变量移动到方程式组中
			if (equationNumber > 0)//判断pEquationIds不为空
			{
				ZF_CALL(cvxPartEqnMoveToEqnSet(pEquationSetIds[i], 1, pEquationIds));//将pEquationIds中第一个变量移动到方程式组中
				WriteMessage("将变量[%d]移动到方程式组[%d]中", pEquationIds[0], pEquationSetIds[i]);
			}
			
		}
		
	}

	ZF_VOID(cvxMemFree((void**)&pEquationIds));//释放内存
	ZF_VOID(cvxMemFree((void**)&pEquationSetIds));//释放内存

	//获取方程式的表达式
	char expressionName[] = "字符串";
	char expressionValue[128];
	ZF_CALL(cvxEqGetExpByName(expressionName, expressionValue, sizeof(expressionValue)));
	WriteMessage("方程式:%s = %s", expressionName, expressionValue);

	//重生成所有方程式
	ZF_CALL(cvxEqRegen(-1));
	WriteMessage("重生成所有方程式");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值