← 返回首页

CAA开发实用的代码片段

另存为一份新的文档数据
HRESULT SaveAs(CATIAdpPLMIdentificator *ipPLMId, CATUnicodeString  istrPrefix)
{
	HRESULT rc = E_FAIL;
	if (NULL == ipPLMId)
	{
		cout << "SaveAs() 形参 CATIAdpPLMIdentificator NULL! " << endl;
		return rc;
	}
	
	CATAdpAttributeSet attributeSet;
	CATAdpDuplicator duplicator;
	if (FAILED(duplicator.AddElement(ipPLMId, attributeSet)))
	{
		cout << "SaveAs() AddElement KO! " << endl;
		return rc;
	}
	if (FAILED(duplicator.Duplicate()))
	{
		return s_FALSE;
	}
	return S_OK;
}
显示/隐藏对象
void HideSpecObject( CATISpecObject_var spSpec,CATBoolean bShown )
{
	HRESULT rc=S_OK;
	if(spSpec!=NULL_var)
	{
		CATIVisProperties* piVisProp=NULL;
		CATVisPropertiesValues ioValues;
		CATShowAttribut oShow;
		if(bShown)
		{
			oShow=CATShowAttr;
		}
		else
		{
			oShow=CATNoShowAttr;
		}
		ioValues.SetShowAttr(oShow);
		if(SUCCEEDED(spSpec->QueryInterface(IID_CATIVisProperties,(void**)&piVisProp)))
		{
			rc=piVisProp->SetPropertiesAtt(ioValues,CATVPShow,CATVPGlobalType);
			piVisProp->Release();
			piVisProp=NULL;
		}
		CATIModelEvents_var spEvents = spSpec;
		if (NULL_var != spEvents)
		{
			CATModifyVisProperties ModifyNotification(spSpec, NULL, CATVPGlobalType, CATVPShow, ioValues); 
			spEvents->Dispatch(ModifyNotification);
		}
	}
}
更新视图

void RefreshView3D(CATISpecObject_var ispSpec)
{
	if (ispSpec==NULL_var)
		return;
	CATIModelEvents_var spModel = ispSpec;
	CATModify notif(ispSpec);
	if ( !!spModel ) 
	{
		spModel->Dispatch(notif);
	}
	CATIRedrawEvent_var spRedraw = ispSpec;
	if(spRedraw != NULL_var)
	{
		spRedraw->Redraw();
	}
}
设置颜色
HRESULT SetColorOnObject(CATISpecObject_var ispiSpecOnObject,unsigned int iRed,unsigned int iGreen,unsigned int iBlue,CATVisGeomType iGeoType)
{
	HRESULT rc=E_FAIL;
	if( !ispiSpecOnObject ) return rc;
	CATVisPropertiesValues AttributeValue;
	AttributeValue.SetColor(iRed,iGreen,iBlue);
	CATIVisProperties *piGraphProp=NULL;
	rc = ispiSpecOnObject->QueryInterface(IID_CATIVisProperties,(void **)&piGraphProp);
	if( FAILED(rc) || !piGraphProp ) return rc;
	rc = piGraphProp->SetPropertiesAtt(AttributeValue,CATVPColor,iGeoType);
	piGraphProp->Release();  piGraphProp = NULL;
	return rc;
}
获取系统的环境变量值
CATUnicodeString GetEnvValue(CATUnicodeString iEnvName)
{
	const char * pPath = iEnvName.ConvertToChar();
	char * t_Value = "";
	CATGetEnvValue(pPath, &t_Value);
	CATUnicodeString sEnvValue = t_Value;
	return sEnvValue;
}
提示信息框
int MessageBoxShow(CATUnicodeString iMessage, CATUnicodeString iTitle, CATDlgStyle iStyle)
{
	int value = -1;
	CATApplicationFrame *pApplication = CATApplicationFrame::GetFrame();
	if (NULL != pApplication)
	{
		CATDlgWindow * pMainWindow = pApplication->GetMainWindow();
		CATDlgNotify *pNotifyDlg = new CATDlgNotify(pMainWindow, iTitle.ConvertToChar(), iStyle);
		if (NULL != pNotifyDlg)
		{
			value = pNotifyDlg->DisplayBlocked(iMessage, iTitle);
			pNotifyDlg->RequestDelayedDestruction();
		}
	}
	return value;
}
GetRootOccurrence

注:CATIPLMNavOccurrence:实例-引用对的投影:在PLM系统中,一个"Occurrence"是某个实例(Instance)和引用(Reference)对的投影。这意味着它是实际对象在特定上下文中的一个表示或映射

HRESULT GetRootOccurrence(const CATBaseUnknown_var &ispRootRef, CATBaseUnknown_var &ospRootOcc)
{
  if (!ispRootRef) return (E_INVALIDARG);

  HRESULT oRc = E_FAIL;
  CATIPrdOccurrenceMngt *piOccMngt = NULL;
  if (SUCCEEDED(CATPrdGetOccurrenceMngt(piOccMngt)))
  {
    CATIPLMNavOccurrence_var spRootOcc;
    CATIPLMNavReference_var spRootRef(ispRootRef);
    if (!!spRootRef)
    {
      if (SUCCEEDED(oRc = piOccMngt->GetOrCreateRootOccurrence(spRootRef, spRootOcc)))
      {
        ospRootOcc = spRootOcc;
      }
    }
    piOccMngt->Release();
    piOccMngt = NULL;
  }
  //}

  return (oRc);
}
更新特征的方法

HRESULT UpdateFeature(CATIMmiMechanicalFeature_var ispMmiMechanicalFeature, CATBoolean IfInsertInProceduralView)
{
	HRESULT rc = E_FAIL;
	if (IfInsertInProceduralView)
	{
		CATIGSMUseProceduralView_var spProceduralView = ispMmiMechanicalFeature;
		if (NULL_var == spProceduralView)
		{
			cout << " UpdateFeature KO 1" << endl;
			return rc;
		}
		rc = spProceduralView->InsertInProceduralView();
		if (FAILED(rc))
		{
			cout << " UpdateFeature KO 2" << endl;
			return rc;
		}
	}

	CATIUseEntity_var hUseEnt(ispMmiMechanicalFeature);
	if (NULL_var == hUseEnt)
	{
		cout << " UpdateFeature KO 3" << endl;
		return E_FAIL;
	}

	rc = DataCommonProtocolServices::Update(hUseEnt);
	if (FAILED(rc))
	{
		cout << " UpdateFeature KO 4" << endl;
		return rc;
	}
	return rc;
}
针对一些对象,无法快速获取该对象的类型,可通过以下方法

HRESULT GetObjectType(CATBaseUnknown* ipUKObject, CATUnicodeString& oustrObjectType)
{
	HRESULT hr = E_FAIL;

	if (NULL == ipUKObject)
	{
		return E_INVALIDARG;
	}

	CATIPLMNavOccurrence_var spiNavOccOnObject = ipUKObject;
	if (NULL_var == spiNavOccOnObject)
	{
		return E_FAIL;
	}

	CATIPLMNavReference* piNavRefOnObject = NULL;
	hr = spiNavOccOnObject->GetRelatedReference(piNavRefOnObject);
	if (FAILED(hr) || NULL == piNavRefOnObject)
	{
		return E_FAIL;
	}

	CATIPLMComponent_var spiComponentOnObject = piNavRefOnObject;
	if (NULL_var == spiComponentOnObject)
	{
		return E_FAIL;
	}

	CATIAdpType* piAdpType = NULL;
	spiComponentOnObject->GetAdpType(piAdpType);

	CATIType* piType = NULL;
	CATPLMTypeServices::GetKweTypeFromAdpType(piAdpType, piType);		// CATIType

	oustrObjectType = piType->Name();

	return S_OK;
}
转换到编辑模式
CATBoolean ChangeOccModeToEdit(CATIPLMNavOccurrence_var ispOcc)
{
	HRESULT rc = E_FAIL;
	if (NULL_var == ispOcc) { return FALSE; }
	CATListPtrCATIPLMNavRepOccurrence  listRepChildren;
	rc = ispOcc->ListRepChildren(listRepChildren);
	if (SUCCEEDED(rc))
	{
		for (int i = 1; i <= listRepChildren.Size(); i++)
		{
			CATIPLMNavRepReference * pRepRefOnChild = NULL;
			CATIPLMNavRepOccurrence_var spRepOcc = listRepChildren[i];
			rc = spRepOcc->GetRelatedRepReference(pRepRefOnChild);
			if (SUCCEEDED(rc) && NULL != pRepRefOnChild)
			{
				CATIPsiRepresentationLoadMode *piRepLoadMode = NULL;
				rc = pRepRefOnChild->QueryInterface(IID_CATIPsiRepresentationLoadMode, (void **)&piRepLoadMode);
				if (piRepLoadMode &&  SUCCEEDED(rc))
				{
					rc = piRepLoadMode->ChangeLoadingMode(CATIPsiRepresentationLoadMode::EditMode);
					if (FAILED(rc))
					{
						return FALSE;
					}
					if (piRepLoadMode) { piRepLoadMode->Release(); piRepLoadMode = NULL; }
				}
				if (pRepRefOnChild) { pRepRefOnChild->Release(); pRepRefOnChild = NULL; }
			}
		}
		listRepChildren.RemoveAll();
	}
	if (FAILED(rc)) return FALSE;
	return TRUE;
}
获取属性值
CATUnicodeString GetObjectAttrValue(CATBaseUnknown * ipBaseUnknown, CATUnicodeString sAttrName)
{
	CATUnicodeString sExternalID("");
	if (ipBaseUnknown == NULL)
		return sExternalID;
	CATIPLMComponent *spCompObject = NULL;
	HRESULT rc = ipBaseUnknown->QueryInterface(IID_CATIPLMComponent, (void**)&spCompObject);
	if (spCompObject == NULL)
		return S_FALSE;

	CATICkeObject * spCkeObject = NULL;
	rc = spCompObject->QueryInterface(IID_CATICkeObject, (void**)&spCkeObject);
	_RELEASE_PTR_(spCompObject);
	if (spCkeObject == NULL)
		return sExternalID;

	CATCkeObjectAttrReadServices::GetValueAsString(spCkeObject, sAttrName, sExternalID);

	_RELEASE_PTR_(spCkeObject);
	return sExternalID;
}
CAA命令中检查许可证或产品是否已启用

在命令的实际代码开始之前插入以下代码行:

int isAuthorized = 0;

isAuthorized = CATSysCAALM::IsProductAuthorized("ABC.prd");

其中“ABC”是某个特定产品的三字母缩写。(例如:FDE 表示 Fasteners Designer,MDG 表示 Mechanical Designer,依此类推。)

代码返回值情况:

  • 0 - 该产品未启用。

  • 非0 - 该产品已启用。

评论