Перейти к публикации

Есть сборка в Sw 2003. Необходимо достать пути всех её компонентов...


Рекомендованные сообщения

Есть сборка в SW 2003. Необходимо достать пути всех её компонентов...

Как я понимаю, для этого есть метод Сomponent2.GetPathName(), но я никак не могу его вызвать,

потому что не знаю как "встать" на объект Сomponent2.

Проблема ещё в том, что програмирую на С++ (ВСВ6.0).

Пожалуйста помогите!

Ссылка на сообщение
Поделиться на других сайтах


Get and Set Component's Suppression State Example (VB)

This example shows how to get and set the suppression state of a component.

'-----------------------------------------------

'

' Preconditions:

' (1) An assembly is open.

' (2) A component is selected.

'

' Postconditions: The selected component's suppression state is set to

' lightweight if the component is resolved.

'

'----------------------------------------------

Option Explicit

Public Enum swComponentSuppressionState_e

swComponentSuppressed = 0 ' Fully suppressed - nothing is loaded

swComponentLightweight = 1 ' Featherweight - only graphics data is loaded

swComponentFullyResolved = 2 ' Fully resolved - model is completely loaded

End Enum

Public Enum swSuppressionError_e

swSuppressionBadComponent = 0

swSuppressionBadState = 1

swSuppressionChangeOk = 2

swSuppressionChangeFailed = 3

End Enum

Sub main()

Dim swApp As SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim swSelMgr As SldWorks.SelectionMgr

Dim swComp As SldWorks.Component2

Dim bRet As Boolean

Dim nRetVal As Long

Set swApp = Application.SldWorks

Set swModel = swApp.ActiveDoc

Set swSelMgr = swModel.SelectionManager

Set swComp = swSelMgr.GetSelectedObjectsComponent2(1)

Debug.Print "File = " & swModel.GetPathName

Debug.Print " Comp = " & swComp.Name2

Debug.Print " Path = " & swComp.GetPathName

Debug.Print " GetSuppression = " & swComp.GetSuppression

Debug.Print " IsSuppressed = " & swComp.IsSuppressed

nRetVal = swComp.setsuppression(swComponentLightweight)

End Sub

'----------------------------------------------------

Ссылка на сообщение
Поделиться на других сайтах

2 Kelny

Он же пишет, что на C++ работатет!

2 DID

Help по SW API не смотрел?

Там же есть пример: "Traverse Assembly Example (C++ COM)".

Посмотри еще

"http://www.solidworks.com/pages/services/APIDownloads.html"

Ссылка на сообщение
Поделиться на других сайтах

Он же пишет, что на C++ работатет!

<{POST_SNAPBACK}>

А какая разница на чем писать, алгоритм то один, объявил потом используешь, полагаю будет что-то вроде этого:

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



void APITestFunction()



{

	HRESULT								 hr = S_OK;



	CComPtr <ISldWorks>					 pSldWorks;

	CComPtr <IModelDoc2>					pModel;

	CComQIPtr <SelectionMgr>					pSelMgr;

	CComQIPtr <Component2>				pComp;

  

	// Connect to SolidWorks

	pSldWorks = TheApplication->GetSWApp();

	ASSERT(pSldWorks);



	hr = pSldWorks->get_IActiveDoc2(&pModel);

	ASSERT(pModel);



	hr = pModel->get_ISelectionManager( &pSelMgr);

	ASSERT(pSelMgr);



	hr = pSelMgr->IGetSelectedObjectsComponent2(1, &pComp);

	ASSERT(pComp);



	BSTR									sPartPath="";

	hr = pSelMgr->GetPathName ( &sPartPath);



return;

}



// -------------------------------------------------------------------
Ссылка на сообщение
Поделиться на других сайтах

А какая разница на чем писать, алгоритм то один, объявил потом используешь, полагаю будет что-то вроде этого:

Ну я в С ни бум-бум, я в VB - там перебор происходит методом рекурсии (см. пример SW API) одной функцией (или процедурой) тут не обойдешся. Честно говоря, я не вижу другого подхода.

Ссылка на сообщение
Поделиться на других сайтах

Наверное где-то так:

void CSW_TstDlg::OnBnClickedButton1()

{

	HRESULT hres;

	ISldWorksPtr swApp;

	swApp.GetActiveObject("SldWorks.Application");



	IModelDoc2Ptr swModel;

	hres = swApp->get_IActiveDoc2(&swModel);

	if(hres != S_OK)

	{

		 return;

	}



	IConfigurationPtr swConfig;

	hres = swModel->IGetActiveConfiguration(&swConfig);



	IComponentPtr swRootComponent;

	hres = swConfig->IGetRootComponent(&swRootComponent);



	VARIANT vChildren;

	hres = swRootComponent->GetChildren(&vChildren);



	SAFEARRAY* arrComp = V_ARRAY(&vChildren);

	LPDISPATCH* pDispComp = 0;



	long lHightIndex;

	long lCountComp;



	hres = SafeArrayAccessData(arrComp, (void**)&pDispComp);

	ASSERT(S_OK == hres);

	ASSERT(NULL != pDispComp);



	hres = SafeArrayGetUBound(arrComp, 1, &lHightIndex);

	ASSERT(S_OK == hres);



	lCountComp = lHightIndex + 1;

	for ( long i = 0; i < lCountComp; i++)

	{

		IComponentPtr  swComponent;

		swComponent = pDispComp[i];

		BSTR strPath;

		swComponent->GetPathName(&strPath);

		//................



	}



}

Правда код под VS2005 и SW2006. С Borland-ом к сожалению не знаком. Не забудь в InitInstance() вставить:

if(!AfxOleInit())

	{

		return FALSE;

	}
У меня это exe-файл. А если в сборке присутсвуют подсборкки, то рекурсия.
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...