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

Sw Api - разные конфигурации детали в сборке


hztp_serg

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

С помощью SW API из под VS2008 C++ ATL-проект используя dll, читаю все компоненты сборки и их параметры. Вот как я полчаю ссылку на модель клмпоненты и активную конфигурацию:

IComponent2 *swComponent=NULL;

IModelDoc2 *swModelDoc=NULL;

IConfiguration *swCfg;

IDispatch *pDispatch;

hres = pComponent->GetModelDoc(&pDispatch);

pDispatch->QueryInterface(&swModelDoc);

swModelDoc->IGetActiveConfiguration(&swCfg);
если конфигурация в компоненте одна, то проблем нет. А если компонент имеет несколько конфигураций и входит в состав сборки в разных конфигурациях, то у меня получается, что я читаю одну и ту ж конфигурацию для всех вхождений компоненты в сборку. Как мне определять какая именно конфигурация компоненты используется в сборке?

Большое спасибо!

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


С помощью SW API из под VS2008 C++ ATL-проект используя dll, читаю все компоненты сборки и их параметры. Вот как я полчаю ссылку на модель клмпоненты и активную конфигурацию:

IComponent2 *swComponent=NULL;

IModelDoc2 *swModelDoc=NULL;

IConfiguration *swCfg;

IDispatch *pDispatch;

hres = pComponent->GetModelDoc(&pDispatch);

pDispatch->QueryInterface(&swModelDoc);

swModelDoc->IGetActiveConfiguration(&swCfg);
если конфигурация в компоненте одна, то проблем нет. А если компонент имеет несколько конфигураций и входит в состав сборки в разных конфигурациях, то у меня получается, что я читаю одну и ту ж конфигурацию для всех вхождений компоненты в сборку. Как мне определять какая именно конфигурация компоненты используется в сборке?

Большое спасибо!

status = Component2->get_ReferencedConfiguration( &ConfigName) или, если используется IDispatсh, ConfigName = Component2.GetReferencedConfiguration ( )

На указатель IConfiguration можно выйти функцией status = ModelDoc2->IGetConfigurationByName ( name, &retval ), используя полученное ранее имя конфигурации

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

status = Component2->get_ReferencedConfiguration( &ConfigName) или, если используется IDispatсh, ConfigName = Component2.GetReferencedConfiguration ( )

На указатель IConfiguration можно выйти функцией status = ModelDoc2->IGetConfigurationByName ( name, &retval ), используя полученное ранее имя конфигурации

Спасибо большое! Всё получилось!

pComponent->get_ReferencedConfiguration(&ConfigName);

swModelDoc->IGetConfigurationByName(ConfigName, &swCfg);

if (swCfg == NULL)

{

	swModelDoc->IGetActiveConfiguration(&swCfg);

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

Спасибо большое! Всё получилось!

pComponent->get_ReferencedConfiguration(&ConfigName);

swModelDoc->IGetConfigurationByName(ConfigName, &swCfg);

if (swCfg == NULL)

{

	swModelDoc->IGetActiveConfiguration(&swCfg);

}
Немного не понял, а зачем тогда вызывать функцию: swModelDoc->IGetActiveConfiguration(&swCfg)? Не приведет ли это к ошибкам? Ведь этой функцией вы получаете указатель на IConfiguration активной конфигурации не компонента в сборке, а модели, которая к конкретному компоненту может не иметь никакого отношения по определенным свойствам.
Ссылка на сообщение
Поделиться на других сайтах
  • 1 месяц спустя...

Немного не понял, а зачем тогда вызывать функцию: swModelDoc->IGetActiveConfiguration(&swCfg)? Не приведет ли это к ошибкам? Ведь этой функцией вы получаете указатель на IConfiguration активной конфигурации не компонента в сборке, а модели, которая к конкретному компоненту может не иметь никакого отношения по определенным свойствам.

Результат выполнения:

pComponent->get_ReferencedConfiguration(&ConfigName);
возвращает пустое значение ConfigName. Дальше выпонение:

swModelDoc->IGetConfigurationByName(ConfigName, &swCfg);
возвращает NULL-значение в swCfg. Что делать в этом случае?

Это на врерхнем уровне сборки. Сборака имеет одну конфигурацию. Если в доном случае делать так:

int CSwApp::TraverseChildren_path(long RecurseLevel, int Poz, CString* MyString, IComponent2 * pComponent, BSTR Path_parent)

{

	int nChildren;

	int i;

	BSTR Path;

	BSTR ConfigName;

	HRESULT hres = S_OK;



	IComponent2 *swComponent=NULL;

	IModelDoc2 *swModelDoc=NULL;

	IConfiguration *swCfg;

	IDispatch *pDispatch;



	//Определяем имя компонеты

	if (RecurseLevel == 0)

	{

		hres = pSwModel->GetPathName(&Path);

		swModelDoc = pSwModel;

	}

	else

	{

		hres = pComponent->GetPathName(&Path);

		hres = pComponent->GetModelDoc(&pDispatch);

		if (pDispatch != NULL)

		{	

			pDispatch->QueryInterface(&swModelDoc);

		}

		else

		{

			pComponent->IGetModelDoc(&swModelDoc);

			if (swModelDoc == NULL)

			{	

				return hres;

			}

		}

	}

	//Определяем конфигурацию компоненты

	pComponent->get_ReferencedConfiguration(&ConfigName);

	swModelDoc->IGetConfigurationByName(ConfigName, &swCfg);

	if (swCfg == NULL)

	{

		swModelDoc->IGetActiveConfiguration(&swCfg);

	}

	//Определяем параметры модели

	VARIANT CustomInfo, MassProperties;

	BSTR HUGEP *pBstrCustomInfo;

	double* pMassProp;

	pMassProp = 0;

	CString Designatio;

	CString Name;

	CString Format;

	CString Note;

	CString Type;

	CString Massa;

	CString Razdel;

	CString Level;

	CString cPoz;

	swModelDoc->GetCustomInfoNames(&CustomInfo);

	swModelDoc->GetMassProperties(&MassProperties);

	SafeArrayAccessData(CustomInfo.parray, (void HUGEP**)&pBstrCustomInfo);

	pMassProp = (double*)MassProperties.parray->pvData;

	Massa.Format(_T("%g"), pMassProp[6]);

	for ( i=0; i<CustomInfo.parray->rgsabound->cElements; i++)

	{

		BSTR InfoValue;

		std::wstring wsValue;

		CComBSTR InfoName = pBstrCustomInfo[i];

		swModelDoc->get_CustomInfo(InfoName, &InfoValue);

		wsValue = InfoName.Copy();

		

		if (InfoName == L"Обозначение")

		{

			Designatio = InfoValue;

		}

		else if (InfoName == L"Наименование")

		{

			Name = InfoValue;

		}

		else if (InfoName == L"Формат")

		{

			Format = InfoValue;

		}

		else if (InfoName == L"Примечание")

		{

			Note = InfoValue;

		}

		else if (wsValue.find(L"Раздел") != std::string.npos)

		{

			Razdel = InfoValue;

		}

	}

	//Определяем раздел СП модели

	VARIANT ParamNames, ParamValues;

	BSTR HUGEP *pBstrParamNames;

	BSTR HUGEP *pBstrParamValues;

	swCfg->GetParameters(&ParamNames, &ParamValues);

	SafeArrayAccessData(ParamNames.parray, (void HUGEP**)&pBstrParamNames);

	SafeArrayAccessData(ParamValues.parray, (void HUGEP**)&pBstrParamValues);

	if ((ParamNames.parray != NULL) & (ParamValues.parray != NULL))

	{

		for ( i=0; i<ParamNames.parray->rgsabound->cElements; i++)

		{

			std::wstring ParamName = pBstrParamNames[i];

			CComBSTR ParamValue = pBstrParamValues[i];

			if ((ParamName.find(L"$СВОЙСТВО@Раздел") != std::string.npos) & (Razdel.IsEmpty()))

			{

				Razdel = ParamValue.Copy();

			}

			else if ((ParamName.find(L"$СВОЙСТВО@Обозначение") != std::string.npos) & (Designatio.IsEmpty()))

			{

				Designatio = ParamValue.Copy();

			}

			else if ((ParamName.find(L"$СВОЙСТВО@Наименование") != std::string.npos) & (Name.IsEmpty()))

			{

				Name = ParamValue.Copy();

			}

		}

	}



	if( S_OK == hres && Path != NULL )

	{

		CString tempstr;



		CString Tmp1(Path_parent);

		CString Tmp2(Path);

		Level.Format(_T("%ld"), RecurseLevel);

		cPoz.Format(_T("%ld"), Poz);

		tempstr += Tmp1 + "§" + Tmp2 + "§" + Designatio + "§" + Name + "§" + Format + "§" + 

			Razdel + "§" + Note + "§" + Massa + "§" + Level + "§" + cPoz;

		tempstr += "\r\n";

		*MyString = *MyString + tempstr;

	}



	RecurseLevel++;

	

	hres = pComponent->IGetChildrenCount(&nChildren);



	if ( S_OK == hres && nChildren > 0)

	{

		VARIANT vArrayChildren;

		pComponent->GetChildren(&vArrayChildren);

		SAFEARRAY *pSa = V_ARRAY(&vArrayChildren);

		IDispatch **pChildren;

		SafeArrayAccessData(pSa, (void**)&pChildren);



		if(S_OK == hres)

		{

			for ( i=0; i<nChildren; i++)

			{

				IDispatch *pDispatch = pChildren[i];

				pDispatch->QueryInterface(&swComponent);

				TraverseChildren_path(RecurseLevel, i+1, MyString, swComponent, Path);

				pChildren[i]->Release();

			}

		}

		SafeArrayUnaccessData(pSa);

		SafeArrayDestroy(pSa);

	}



	RecurseLevel--;

	return nChildren;



}
то в следующем рекурсивном вызове TraverseChildren получаем NULL вместо ссылки на модель компоненты:

hres = pComponent->GetModelDoc(&pDispatch);

		if (pDispatch != NULL)

		{	

			pDispatch->QueryInterface(&swModelDoc);

		}

		else

		{

			pComponent->IGetModelDoc(&swModelDoc);

			if (swModelDoc == NULL)

			{	

				return hres;

			}

		}
как правельно организовать рекурсивное определение моделей компонентов сборки?

Проект делаю на VS2008 ATL-проект в виде dll-файла. SW2009.

Большое спасибо!

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

hztp_serg

Особо не вникал в ваш код, но мне кажется, что в цикле, где происходит рекурсивный вызов функции TraverseChildren_path, вы в нее передаете не тот указатель на IComponent2. Проще объявить в цикле локальный указатель на IComponent2 и уже его передавать в функцию. Примерно так:

#include "stdafx.h"

using namespace std;



void FindAllComponent(IComponent2*);



int _tmain(int argc, _TCHAR* argv[])

{

	CComBSTR strMessage;

	long lResult;

	::CoInitialize(NULL);



	HRESULT hres;

	CoInitialize(NULL);

	CLSID clsid;

	CLSIDFromProgID(L"SldWorks.Application", &clsid);

	

	ISldWorks *swApp = NULL;

	CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, __uuidof(ISldWorks), (void**)&swApp);

	if(swApp == NULL)

	{		

		::CoUninitialize();

		return 0;

	}

	hres = swApp->put_Visible(VARIANT_TRUE);



	IModelDoc2 *swModel = NULL;

	hres = swApp->get_IActiveDoc2(&swModel);

	if(swModel == NULL)

	{

		strMessage = L"Загрузите документ SolidWorks-a!";

		swApp->SendMsgToUser2(strMessage, swMbInformation, swMbOk, &lResult);

		::CoUninitialize();

		return 0;

	}

	long docType;

	hres = swModel->GetType(&docType);

	if(docType != swDocASSEMBLY)

	{

		strMessage = L"Функция работает только с документом сборки!";

		swApp->SendMsgToUser2(strMessage, swMbInformation, swMbOk, &lResult);

		::CoUninitialize();

		return 0;		

	}

	

	// далее код только для одной конфигурации сборки.

	IConfiguration *swConfigAsm = NULL;

	hres = swModel->IGetActiveConfiguration(&swConfigAsm);

	

	IComponent2 *swRootComponent = NULL;

	hres = swConfigAsm->IGetRootComponent2(&swRootComponent);

	FindAllComponent(swRootComponent);

	

	::CoUninitialize();

	return 0;

}



void FindAllComponent(IComponent2 *pComponent)

{

	HRESULT hres;

	int count;

	hres = pComponent->IGetChildrenCount(&count);

	VARIANT vArrayChildren;

	hres = pComponent->GetChildren(&vArrayChildren);

	SAFEARRAY *pSa = V_ARRAY(&vArrayChildren);

	IDispatch **pChildren = NULL;

	hres = SafeArrayAccessData(pSa, (void**)&pChildren);

	

	for(int i = 0; i < count; i++)

	{

		IDispatch *pDispatch = pChildren[i];

		IComponent2 *swComponent = NULL; // объявляем локальный указатель на IComponent2

		hres = pDispatch->QueryInterface(IID_IComponent2, (void**)&swComponent); 

		if(swComponent == NULL)

			continue;

#if _DEBUG

		USES_CONVERSION;

		CComBSTR nameComp;

		hres = swComponent->get_Name2(&nameComp);

		OutputDebugString(CW2A(nameComp));

		OutputDebugString("\n");				

#endif				

		FindAllComponent(swComponent); // передаем его в рекурсивный вызов функции

		pChildren[i]->Release();			

	}

		

	SafeArrayUnaccessData(pSa);

	SafeArrayDestroy(pSa);

}

Код, естественно, упрощен, опущены многие проверки.

VS2003, консоль. SW2009SP3.0

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

Пробую так:

int CSwApp::TraverseChildren_path(long RecurseLevel, int Poz, CString* MyString, IComponent2 * pComponent, BSTR Path_parent, IConfiguration * swCfg_parent)

{

	int nChildren;

	int i;

	BSTR Path;

	BSTR ConfigName;

	HRESULT hres = S_OK;



	IModelDoc2 *swModelDoc=NULL;

	IConfiguration *swCfg;

	IDispatch *pDispatch;



	//Определяю путь, конфигурацию и ссылку на маодель компоненты

	if (RecurseLevel == 0)

	{

		//Верхний уровень сборки

		Path = Path_parent;		//Путь к модели сборки

		swCfg = swCfg_parent;	//Конфигурация сборки

		swModelDoc = pSwModel;	//Указатель на модель сборки

	}

	else

	{

		//Подуровни сборки

		hres = pComponent->GetPathName(&Path);		//Путь к модели компоненты

		//Указатель на модель компоненты

		hres = pComponent->GetModelDoc(&pDispatch);

		pDispatch->QueryInterface(&swModelDoc);

		if (swModelDoc == NULL)

		{	

			return hres;

		}

		//Определяем конфигурацию компоненты

		pComponent->get_ReferencedConfiguration(&ConfigName);

		swModelDoc->IGetConfigurationByName(ConfigName, &swCfg);

		if (swCfg == NULL)

		{

			return 0;

		}

	RecurseLevel++;

	

	hres = pComponent->IGetChildrenCount(&nChildren);



	if ( S_OK == hres && nChildren > 0)

	{

		VARIANT vArrayChildren;

		pComponent->GetChildren(&vArrayChildren);

		SAFEARRAY *pSa = V_ARRAY(&vArrayChildren);

		IDispatch **pChildren;

		SafeArrayAccessData(pSa, (void**)&pChildren);



		if(S_OK == hres)

		{

			for ( i=0; i<nChildren; i++)

			{

				IDispatch *pDispatch = pChildren[i];

				IComponent2 *swComponent = NULL; // объявляем локальный указатель на IComponent2

				hres = pDispatch->QueryInterface(IID_IComponent2, (void**)&swComponent); 

				TraverseChildren_path(RecurseLevel, i+1, MyString, swComponent, Path, swCfg);

				pChildren[i]->Release();

			}

		}

		SafeArrayUnaccessData(pSa);

		SafeArrayDestroy(pSa);

	}



	RecurseLevel--;

	return nChildren;



}
Проблема когда я на подуровнях сборки, имея указатель на IComponent2 пытаюсь определить указатель на модель компоненты:

//Указатель на модель компоненты

		hres = pComponent->GetModelDoc(&pDispatch);

		pDispatch->QueryInterface(&swModelDoc);

		if (swModelDoc == NULL)

		{	

			return hres;

		}
в результате получаю swModelDoc == NULL. Перед этим выполнение:

hres = pComponent->GetPathName(&Path);		//Путь к модели компоненты
завершается успешно, тоесть возвращает Путь к модели компоненты.

Почему я немогу получить указатель на модель компоненты?

Большое спасипбо!

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

Пробую так:

[code...

Какой SW у Вас?

Вот смотрю сейчас HELP API SW2008 и вижу примеры:

1) Traverse Assembly Example (C++ COM)

This example shows how to traverse an assembly using the Component2 object. The method Component2::IGetChildren returns an array, so

this code must be used in an in-process DLL. Otherwise, use the method ...

2) Traverse Hierarchy of Configurations Example (VB)

This examples shows how to traverse a hierarchy of configurations...

И масса других примеров. В том же Helpe. В HELP API SW2009/10 ИМХО еще больще примеров в разных вариантах и на разных языках.

Также существует масса примеров с разных сайтов...

Может не стоит "изобретать велосипед" ?

Хочу надеяться, что без обид...

Конечно, если интерес чисто академический...

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

У меня SW2009, я по примерам и советам на форуме писал обработку. Но не для всех сборок, я так понял работает только там где сборка состоит из одного уровня.

Спасибо и на том, буду искать.

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

У меня SW2009, я по примерам и советам на форуме писал обработку. Но не для всех сборок, я так понял работает только там где сборка состоит из одного уровня.

Спасибо и на том, буду искать.

Сам когда-то изучал данный вопрос(но, я на VB6), так что по`C`почти ничего подсказать не могу.

НО, это:

"Но не для всех сборок, я так понял работает только там где сборка состоит из одного уровня"

- неверно, там можно задавать любой уровень вложенности! Там же рекурсия!

Причем и сканировать компонеты можно 2-мя способами: и по "типу вложенности" и просто по дереву построения.

Опять же с любым уровнем вложенности.

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

Проблема когда я на подуровнях сборки, имея указатель на IComponent2 пытаюсь определить указатель на модель компоненты:

//Указатель на модель компоненты

		hres = pComponent->GetModelDoc(&pDispatch);

		pDispatch->QueryInterface(&swModelDoc);

		if (swModelDoc == NULL)

		{	

			return hres;

		}
в результате получаю swModelDoc == NULL. Перед этим выполнение:

hres = pComponent->GetPathName(&Path);		//Путь к модели компоненты
завершается успешно, тоесть возвращает Путь к модели компоненты.

Почему я немогу получить указатель на модель компоненты?

Большое спасипбо!

Если вы получили путь к модели компонента, а указатель на IModelDoc2 равен NULL, то большая вероятность, что компонент в сборке сокращенный или погашенный. В этом случае, да указатель на IModelDoc2 будет равен NULL. Введите проверку функцией status = Component2->GetSuppression( &Suppression ) или решите сборку перед использованием функции.
Ссылка на сообщение
Поделиться на других сайтах

Если вы получили путь к модели компонента, а указатель на IModelDoc2 равен NULL, то большая вероятность, что компонент в сборке сокращенный или погашенный. В этом случае, да указатель на IModelDoc2 будет равен NULL. Введите проверку функцией status = Component2->GetSuppression( &Suppression ) или решите сборку перед использованием функции.

Так оно и есть. Для сокращённых или погашенных компонентов указатель на IModelDoc2 NULL. Хотелось бы попробовать автоматизировать процес решений компонентов в процесе рабьоты моей функции, если компонент сокращённый, спросить пользователя "Компонент 8ВП.140.872-15 сокращён. Решить?". Я так понимаю это надо делать с помощью swComponent->SetSuppression2?
Ссылка на сообщение
Поделиться на других сайтах

Так оно и есть....

Ну на `C` я не знаю, вот на VB:

retSupp = component.IsSuppressed() ' TRUE if this component is suppressed; FALSE otherwise

retHide = component.IsHidden(True) ' If retSupp <> True And retHide <> True Then

If retSupp <> True And retHide <> True Then

NameOfComp = component.Name

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

Так оно и есть. Для сокращённых или погашенных компонентов указатель на IModelDoc2 NULL. Хотелось бы попробовать автоматизировать процес решений компонентов в процесе рабьоты моей функции, если компонент сокращённый, спросить пользователя "Компонент 8ВП.140.872-15 сокращён. Решить?". Я так понимаю это надо делать с помощью swComponent->SetSuppression2?

Да, вы правильно понимаете. Функцией status = Component2->GetSuppression( &Suppression ) вы получаете состояние компонента. Анализируете. И функцией status = Component2->SetSuppression2 ( state, &retval) устанавливаете нужное значение. Если необходимо, то при погашенном состоянии компонента, можно функциями, которые указал ssv22 узнать его состояние. (погашен или погашен и скрыт).
Ссылка на сообщение
Поделиться на других сайтах

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

long Suppression, lError;

	VARIANT_BOOL bSupp, bHide;

	VARIANT vConfig_names;

	pComponent->IsSuppressed(&bSupp);

	pComponent->IsHidden(TRUE, &bHide);

	if ( bSupp == TRUE )

	{

		pComponent->SetSuppression2(0, &lError);

	}

	if ( bHide == TRUE )

	{

		pComponent->SetVisibility(1, 1, vConfig_names);

	}
определить скрытый или сокращённый вроде получается, сделать решённым вроде тоже похоже, в вот SetVisibility, первый параметр 0- скрытый, 1- видимый, вроди так; второй - выбрал swThisConfiguration - 1, только для этой конфигурации, вроди так; а вот третий параметр - Config_names для меня непонятен, зачем масив имён конфигураций? Подскажите пожалуйста, как правелно эта задачу решить? Большое спасибо!
Ссылка на сообщение
Поделиться на других сайтах

определить скрытый или сокращённый вроде получается, сделать решённым вроде тоже похоже, в вот SetVisibility, первый параметр 0- скрытый, 1- видимый, вроди так; второй - выбрал swThisConfiguration - 1, только для этой конфигурации, вроди так; а вот третий параметр - Config_names для меня непонятен, зачем масив имён конфигураций? Подскажите пожалуйста, как правелно эта задачу решить? Большое спасибо!

Зачем Config_names? А хрен его знает. Надо у разработчиков спрашивать, зачем они его ввели. Родственная ей функция status = Component2->IGetVisibility ( config_opt, config_count, config_names, states ) тоже странно работает. Только когда первый аргумент равен swThisConfiguration. В этом случае возвращается указатель на массив типа long. При передаче swAllConfiguration возвращается нулевой указатель.

Хотя мне не совсем понятно, зачем вам делать видимым компонент, если он был скрыт. Если он скрытый, но не сокращенный и не погашенный, то доступ ко всем свойствам и функциям модели этого компонента имеется. А так, вот рабочая тестовая функция, где используется SetVisibility.

void SetVisibleComponent(IComponent2 *swComponent)

{

	HRESULT hres;

	IModelDoc2 *swModel = NULL;

	hres = swComponent->IGetModelDoc(&swModel);

	if(swModel == NULL)

		return;

	long countConfig;

	hres = swModel->GetConfigurationCount(&countConfig);

	BSTR *vNames = new BSTR[countConfig];

	hres = swModel->IGetConfigurationNames(&countConfig, vNames);

	long *states = new long[countConfig];

	hres = swComponent->IGetVisibility(swThisConfiguration, countConfig, vNames, states);

	

	for(int j = 0; j < countConfig; j++)

	{

		long state = states[j];

		if(state == swComponentVisible)

			state = swComponentHidden;

		else

			state = swComponentVisible;

		hres = swComponent->ISetVisibility(state, swThisConfiguration, countConfig, vNames);

	}

	delete[] states;

	delete[] vNames;

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • ispite
      Всем привет, спасибо за ответы, но просто так не удалось создать сборку, солид выдавал ошибку. Пришлось Сохранить как IGES (файл разросся до 920 МБ), потом открыл как деталь (в нейстало шустрее работать), нажал "создать сборку" и она создалась! НО она создалась без поверхностей, а они тоже нужны Всем привет, спасибо за ответы, но просто так не удалось создать сборку, солид выдавал ошибку. Пришлось Сохранить как IGES (файл разросся до 920 МБ), потом открыл как деталь (в ней появились Тела и Поверхности и стало шустрее работать), нажал "создать сборку" и она создалась! НО она создалась без поверхностей, а они тоже нужны. Как создать сборку с телами и поверхностями? Пробовал в детали сохранить поверхности, но оно как будто работает наоборот и все поверхности стирает.  PS удалите плз предыдущий ответ, я его случайно отправил.
    • Alexey8107
      Всем доброго дня. Имеется ивановский обрабатывающий центр ИС-800, в нем установлены: PSM-45HVi A06B-6120-H045 SPM-30HVi A06B-6121-H030#H550 Возникла авария 9030 Overcurrent in the converter input circuit. Если смотреть В-65285 в этом случае на PSM должна отображаться 1, а на SPM - 30. Так оно и есть на самом деле. Документ ссылается на пункт 3.1.1, в свою очередь этот пункт говорит о неисправности PSM и следует проверить Входящее питание. Скорее всего здесь имеется ввиду питание управления, оно 240 В и стабильно Рекомендуют проверить реактор. Сразу откидываем, т.к. дело до включения силового питания еще даже не доходит, МСС отключен. Да и реактор штатный, всю жизнь работал с этим реактором. Проверить IGBT. Проверить проверил как мог, на КЗ, но дело до силовухи еще не доходит, ее питания еще нет и физически включиться не может из за MCC(ну это естественно, блок в аварии). Принципиально все рекомендации. На LEADWELL была похожая ситуация, на торможении шпинделя на PSM помнится выпадала авария 1, а на шпинделе не помню уже что. Тоже думали на PSM, а судя по всему мозг вынимал рекуператор в SPM. Т.к. на шине 500 вольт на торможении шпинделя напряжение вылетало далеко за 500 вольт выше. Здесь тоже нечто подобное, SPM опрокидывает PSM в аварию. Вобщем при включении питания станка, запитывается только управление на PSM, а он в свою очередь раздает 24 вольта на все остальные блоки по CXA2A, если все нормально и ЧПУ включена, замыкается контакт МСС, разрешая подачу силового питания на PSM. Шаги загрузки на полностью исправном станке PSM    SPM   -          A   -         50   -         12(или 18)   -         -- После включения ЧПУ и подачи силового питания   0         0 У нас PSM    SPM   -          A   -         50   -         12(или 18)   1         30 Включение силовухи невозможно. Что было сделано: 1. Проверены все питания, 240 СХ1А, 24 СХА2А, силовое питание, везде порядок. 2. Проверены IGBT на PSM и SPM, явного замыкания нет. 3. Проверены обмотки серво двигателя шпинделя. На всех 0,4 ома(сопротивление щупов 0,2 + обмотки 0,2 ома). Сравнил с заведомо исправным таким же двигателем(он стоит в другом таком же станке и работает), все тоже самое, На массу КЗ нет. Да и силовухи тоже нет, так что это бессмысленно. 4. Откинул от PSM разъем СХА2А(тупо обесточил остальные блоки от 24 вольт), включил питание управления, PSM перестал опрокидываться в ошибку, на дисплее "-". Ждал долго, не опрокидывается. Силовое питание подавать не стал, ибо чревато для остальных блоков, а скидывать шинку постоянного тока честно говоря поленился. 5. С соседнего станка снял плату управления SPM и переставил в неисправный станок, по номерам они идентичные. Станок включился и даже подал силовое питание на PSM без всяких аварий. Гонял пару минут в холостую, все было нормально, но после опрокинулся с той же ошибкой 1 и 30 на PSM и SPM соответственно. 6. Взял плату управления SPM с неисправного станка и установил в исправный. Станок включился и сколько бы не гонял, и даже шпинделем крутил, не опрокидывается. Т.е. к обоим платам претензий ноль. После вернул все обратно. Исправный станок работает как ни в чем не бывало, неисправный сразу опрокидывается в аварию почти сразу после включения управляющего питания. На ЧПУ ошибка 9030 и какие то еще по осям, но они связаны с отсутствием питания на шине постоянного тока если не ошибаюсь, так что это нормально. Итого, силовуха явных признаков неисправности не имеет, и даже на какое то время с другой платой включает силовое питание(скорее всего это связано с разбросом параметров защит на разных платах). К самому PSM тоже вроде претензий не должно быть, хотя В-65285 указывает именно на него. В истории с LEADWELL точно помню, что тоже все указывало на PSM(в том числе 1 на дисплее), и даже сервисный инженер FANUC был уверен в неисправности именно PSM. По факту, неисправен был как раз SPM. К платам управления тоже никаких претензий, обе работают в исправном станке. Единственное логическое объяснение, неисправность силовухи SPM. НО!!! Шина постоянного тока даже не думает запитываться, так что и тут с опрокидыванием сразу после включения есть засада! Ну не тестирует же SPM и PSM силовую часть напряжением 24 вольта??? Ведь до включения силового питания в этом случае даже не доходит из-за аварии! Может у кого есть еще идеи или опыт устранения таких дефектов? Помнится у фанука была типовуха на платах А16В-2203-0623 с датчиками тока, они отгорали и привод отваливался в аварию по одной из фаз. Это были привода шпинделя и двух осей в одном корпусе, были такие у нас на токарных. Сервисники фанука тогда их тучами меняли... Хотя тут я думаю не наш случай
    • Kelny
      Даже при всём при этом оно не всегда корректно работало, так что даже в старых версиях было быстрее удалить размер и потом вставить заново, чем искать эти точки размеров, а потом пытаться их привязать к новому месту.   Возможно это всего лишь глюк новой версии, в последних версиях они похоже штатно закладываются.
    • maxx2000
      @davidovka я их сразу ссыпаю в TEMP,  в тех что живы нет отметок о создании current_session.pro. Интересно что сам current_session.pro создаётся, но не обновляется дата в отличии от даты модели. Может быть и вправду менял какие нить настройки и забывал сохранить
    • Ahito
    • maxx2000
      т.е. доверять разработчикам оснований нет. Ясно-понятно
    • clavr
      все так и было до 2024 версии. размеры не импортировались. теперь вот в 2024 так нельзя. может где-то в настройках поменять что нужно? все перерыл, пока не нашел
    • arsenev
      Первый свободный номер инструмента   int list $toolnumblist = extract(folder('TOOL'), 'Tool.Number.Value') int $newToolNumb = 1 while member( $toolnumblist, $newToolNumb) {     $newToolNumb = $newToolNumb + 1 } Message Info 'Первый свободный номер инструмента - ' + $newToolNumb     Инструменты с повторяющимися номерами   int list $toolnumbers = extract(folder('tool'),'Number.Value') int $i = remove_duplicates($toolnumbers) string $op = '' foreach $n in $toolnumbers {     string list $names = extract(filter(folder('tool'),'this.Number.Value == "' + $n + '"'),'Name')     if size($names) > 1 {         $op = $op + 'Инструменты с повторяющимся номером T ' + $n + CRLF         foreach $name in $names {             $op = $op + $name + CRLF         }         $op = $op + CRLF     } } message info $op     Удаление выбранного   Макрос, который проверяет тип объекта, а затем позволяет выбрать один и удалять выбранные части. Я связал это с ctrl+d.   string list $rootTypes = {'toolpath','featureset','pattern','boundary','model'} string list $selectedTypes = {} foreach $rt in $rootTypes {     if entity_exists(entity($rt,'')) {         entity $ent = entity($rt,'')         if number_selected($ent.RootType, $ent.Name) > 0 {             int $i = add_last($selectedTypes,$rt)         }     } } if size($selectedTypes) <= 0 {     return } int $index = -1 if size($selectedTypes) == 1 {     $index = 0 } else {     $index = input choice $selectedTypes 'Wich Type to remove?' } if $index != -1 {     String $cmd = 'DELETE ' + $selectedTypes[$index] + ' "' + entity($selectedTypes[$index],'').Name + '" SELECTED'         DoCommand $cmd }
    • PETR_1
      Можно переназначить правую и центральную (колесо) кнопки с помощью бесплатной программы X-Mouse Button Control (есть портабельная версия). Это переназначение будет работать только для компаса.
    • Kelny
      Может изменяемый вами размер импортирован из модели?  Обычно переносилось удержанием левой кнопки мыши, а если сделать двойной клик, то нужно потом выбрать новый объект уже без удержания кнопок мыши.
×
×
  • Создать...