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

Delphi -> SolidWorks Сборка!


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

У меня такая проблема!

Я из Делфи создаю в SW детали которые потом буду сопрягать в сборке! и на моменте создания самих деталей я могу переберать грани которые мне нужно сопрягать !

но после я их загружаю в новый документ сборки ! и там уже те ссылки не работают, точнее они выбирают нужные мне грани в документе самой детали, а мне необходимо сопрягать грани в сборке!

Вопрос ! Как мне в документе сборке где у меня загружены 3 детали выбирать нужные мне грани для сопряжения!

заранее спасибо!

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


У меня такая проблема!

Я из Делфи создаю в SW детали которые потом буду сопрягать в сборке! и на моменте создания самих деталей я могу переберать грани которые мне нужно сопрягать !

но после я их загружаю в новый документ сборки ! и там уже те ссылки не работают, точнее они выбирают нужные мне грани в документе самой детали, а мне необходимо сопрягать грани в сборке!

Вопрос ! Как мне в документе сборке где у меня загружены 3 детали выбирать нужные мне грани для сопряжения!

заранее спасибо!

Не совсем все понятно... Буду выяснять по частям. У Вас программный модуль Delphi, который создает детали для солида?

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

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

Ну не совсем я так и думал что не понятно написал!

У меня программа по нажатию одной кнопки создает детали - к примеру 3 штуки. и когда я их создаю функция которая создает поверхность (FEATURE) оставляет ссылку на поверхность ( тоесть деталь мою) и я могу переберать любые кромки и поверхности.

НО! мне то нужно, чтобы я мог выбирать любые поверхности моих деталей в сборке! чтобы правильно построить сопряжения! А у меня не получается получить ссылку на объекты которые в сборке! ну или я просто не знаю как!!

тоесть главный вопрос как сделать сборку из (к примеру 3 деталей) чтобы ты методом тыка

(по координатам) выбирать поверхности и после чего создавать сопряж, а напрямую выбирать поверхности программно!

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

...методом тыка (по координатам) выбирать поверхности и после чего создавать сопряжения...

Какой ужас... я представляю, сколько нужно было истратить времени и сил, чтобы создать это программно...

У меня программа по нажатию одной кнопки создает детали - к примеру 3 штуки. и когда я их создаю функция которая создает поверхность (FEATURE) оставляет ссылку на поверхность ( тоесть деталь мою) и я могу переберать любые кромки и поверхности.

Сразу говорю, программно я ничего не реализовывала. Но быть может есть разница в ссылках в деталях и ссылках в сборке. Может есть смысл попробовать записать макрос в сборке и макрос в детали. Сравнить ссылки.

Извиняюсь за :poster_offtopic: Пока в технаре училась, нам препод по программированию говорил, что нужно делать программу, чтобы все было по нажатию одной кнопки. Все время моей работы с программами мечтала по "нажатию одной кнопки"!))))

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

Select Component Face By Name Example (VBA)

SolidWorks API Help

Select Component Face By Name Example (VBA)

This example shows how to find and select a face using its name. The face must belong to an assembly component. This code can be extended to traverse all assembly components, select assembly component geometry by name, and create assembly mates using the selected items.

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



Public Sub SelectComponentFaceByName(CompName As String, FaceName As String)



 



Dim swApp As Object



Dim AssyDoc As Object



Dim SelMgr As Object



Dim Comp As Object



Dim Body As Object



Dim Face As Object



Dim CurFaceName As String



 



Const swSelCOMPONENTS = 20



Set swApp = CreateObject("SldWorks.Application")



 



' Get active Assembly document



Set AssyDoc = swApp.ActiveDoc() 



Set SelMgr = AssyDoc.SelectionManager()



AssyDoc.SelectByID CompName, "COMPONENT", 0, 0, 0



Set Comp = SelMgr.GetSelectedObject3(1)



 



If (SelMgr.GetSelectedObjectType2(1) <> swSelCOMPONENTS) Then



swApp.SendMsgToUser "Please Select an Assembly Component."



Exit Sub



End If



 



Set Body = Comp.GetBody() ' Get the Component Body



 



If (Body Is Nothing) Then



swApp.SendMsgToUser "Component Body Unavailable."



swApp.SendMsgToUser "Make sure not lightweight or suppressed"



Exit Sub



End If



 



Set Face = Body.GetFirstFace



 



' Traverse thru all body faces



Do While Not Face Is Nothing 



' Call ModelDoc.GetEntityName.



CurFaceName = AssyDoc.GetEntityName(Face) 



 



If (CurFaceName = FaceName) Then



Face.Select (0) ' Select the face



Exit Do



End If



 



Debug.Print CurFaceName



Set Face = Face.GetNextFace



Loop



 



' Subsequent code might select a second face, edge, or feature, and then mate the two items using AssemblyDoc::AddMate.



 



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

ну дело не в разницы в ссылках! просто как программно получить ссылку на тот объект(деталь) которую я получаю просто загружаю его из файла например!

это нужно для того чтобы потом я мог построить сопряжения, и там где необходимо указывать сопрягаемые элементы я буду добираться до нужных мне (кромок, поверхностей, точек) через эту ссылку на объект!!!

=)

ну или как сборку из делфи сделать если я имею 3 файла с деталями!

Изменено пользователем xboxlover
Ссылка на сообщение
Поделиться на других сайтах

ну или как сборку из делфи сделать если я имею 3 файла с деталями!

С Delphi, к сожалению, не знаком. Но вот старый пример на С++. Может поможет.

Скрытый текст: Код
#include "stdafx.h"



void GetXFormComponent(IComponent2*, double*);



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

{

	// пути деталей, сборки, и шаблона. У вас могут быть другие

	CComBSTR strFilePart_1 = L"d:\\Втулка.SLDPRT";

	CComBSTR strFilePart_2 = L"d:\\Колонка.SLDPRT";

	CComBSTR strFileAsm = L"d:\\Proba_asm.SLDASM";

	CComBSTR strTemplateAsm = L"c:\\Program Files\\SolidWorks Corp\\SolidWorks\\data\\templates\\Assembly.asmdot";

	CComBSTR strError;



	VARIANT_BOOL bres;

	long lErrors, lWarning;



	::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); // если процесс запущен, то показываем SW



	IModelDoc2 *swModel = NULL;

	hres = swApp->get_IActiveDoc2(&swModel);



	long lresult;

	if(swModel != NULL)

	{

		strError = L"Для данного примера все документы должны быть закрыты, а SolidWorks загружен!";

		swApp->SendMsgToUser2(strError, swMbStop, swMbOk, &lresult);

		::CoUninitialize();

		return 1;

	}



	// создаем новый документ сборки, только для примера

	hres = swApp->INewDocument2(strTemplateAsm, 0, 0.0, 0.0, &swModel); 

	if(swModel == NULL) // если не создали, то выходим из функции

	{

		strError = L"Новый документ не создан!";

		swApp->SendMsgToUser2(strError, swMbStop, swMbOk, &lresult);

		swApp = NULL;

		::CoUninitialize();

		return 1;

	}



	IModelDocExtension *swModelExt = NULL;

	hres = swModel->get_Extension(&swModelExt);



	hres = swModel->SaveAs4(strFileAsm, swSaveAsCurrentVersion, swSaveAsOptions_Silent, &lErrors, &lWarning, &bres); // сохраняем документ сборки

	if(bres == VARIANT_FALSE) // если не сохранили, то выходим из функции

	{

		strError = L"Документ не сохранен!";

		swApp->SendMsgToUser2(strError, swMbStop, swMbOk, &lresult);

		swApp = NULL;

		::CoUninitialize();

		return 1;

	}

	swModel = NULL;



	// открытие и добавление детали в сборку, возможно, если она уже окрыта потребуется проверка и астивация детали

	// здесь для примера упрощено

	hres = swApp->OpenDoc6(strFilePart_1, swDocPART, swOpenDocOptions_Silent, L"Default", &lErrors, &lWarning, &swModel); // открываем первую деталь

	if(swModel == NULL) // если не открыли первую деталь, то выходим из функции

	{

		strError = L"Первый документ не открылся!";

		swApp->SendMsgToUser2(strError, swMbStop, swMbOk, &lresult);

		swApp = NULL;

		::CoUninitialize();

		return 1;

	}

	swModel = NULL;



	hres = swApp->IActivateDoc3(strFileAsm, VARIANT_TRUE, &lErrors, &swModel); // активируем документ сборки

	IAssemblyDoc *swAssembly = NULL;

	hres = swModel->QueryInterface(IID_IAssemblyDoc, (void**)&swAssembly);



	IComponent2 *swComponent_1 = NULL;

	hres = swAssembly->AddComponent4(strFilePart_1, L"Default", 0, 0, 0, &swComponent_1); // добавляем первый компонент в сборку. это втулка.

	CComBSTR sNameComp_1;

	hres = swComponent_1->get_Name2(&sNameComp_1);



	// То же самое делаем со второй деталью. Для примера то же упрощено

	hres = swApp->OpenDoc6(strFilePart_2, swDocPART, swOpenDocOptions_Silent, L"Default", &lErrors, &lWarning, &swModel); // открываем вторую деталь

	if(swModel == NULL) // если не открыли вторую деталь, то выходим из функции

	{

		strError = L"Первый документ не открылся!";

		swApp->SendMsgToUser2(strError, swMbStop, swMbOk, &lresult);

		swApp = NULL;

		::CoUninitialize();

		return 1;

	}

	swModel = NULL;



	hres = swApp->IActivateDoc3(strFileAsm, VARIANT_TRUE, &lErrors, &swModel); // активируем документ сборки

	swAssembly = NULL;

	hres = swModel->QueryInterface(IID_IAssemblyDoc, (void**)&swAssembly);

	

	// добавляем второй компонент компонент в сборку. Позиция его не определена, расположение будет произвольным

	IComponent2 *swComponent_2 = NULL;	

	hres = swAssembly->AddComponent4(strFilePart_2, L"Default", -1, -1, -1, &swComponent_2);

	CComBSTR sNameComp_2;

	hres = swComponent_2->get_Name2(&sNameComp_2);



	CComBSTR strNamedView(L"*Trimetric");

	swModel->ShowNamedView2(strNamedView, -1);

	hres = swModel->ViewZoomtofit2();

	swModel->GraphicsRedraw2();

	

	swModel->ClearSelection2(VARIANT_TRUE);



	// далее будем выбирать Face у компонентов и накладывать сопряжение концетричность

	double arrData1[16];

	GetXFormComponent(swComponent_1, arrData1); // получаем матрицу преобразования для первого компонента - втулки



	double arrData2[16];

	GetXFormComponent(swComponent_2, arrData2); // получаем матрицу преобразования для второго компонента - колонки

		// ******* Face  у втулки ******************

	// так как втулка у нас вытянута в обе стороны по оси Z, достаточно получить точку лежащую на внутреннем диаметре на оси X или оси Y

	// берем по оси X, получем единичный вектор по этой оси компонента

	double dXx_1 = arrData1[0];

	double dXy_1 = arrData1[1];

	double dXz_1 = arrData1[2];



	// вектор переноса для первого компонента

	double dVx_1 = arrData1[9];

	double dVy_1 = arrData1[10];

	double dVz_1 = arrData1[11];



	// находим точку выбора у втулки, где 11 радиус внутреннего отверстия втулки, выраженный в миллиметрах

	double dV_X1 = dXx_1 * (11.0 / 1000) + dVx_1;

	double dV_Y1 = dXy_1 * (11.0 / 1000) + dVy_1;

	double dV_Z1 = dXz_1 * (11.0 / 1000) + dVz_1;



	//CComBSTR strNameFace = L"";

	CComBSTR strTypeObj = L"FACE";



	// выбираем Face у втулки

	hres = swModelExt->SelectByID2(L"", strTypeObj, dV_X1, dV_Y1, dV_Z1, VARIANT_TRUE, 0, NULL, swSelectOptionDefault, &bres);	

	if(bres == VARIANT_FALSE)

	{

		strError = L"Поверхность у первого компонента не выбрана!";

		swApp->SendMsgToUser2(strError, swMbStop, swMbOk, &lresult);

		::CoUninitialize();

		return 1;

	}



	// ******* Face  у колонки *****************

	// Будем выбирать точку на фейсе колонки, на диаметре 22мм. Т.к. вытягивание происходило по оси Z и в колонке присутствует бурт,

	// то достаточно найти вектор равный сумме двух векторов, один из которых направлен по оси Z и имеет длину равную половине размера 150мм вытягивания колонки, 

	// а второй направлен по оси X или Y и имеющий длину равную 11мм



	// единичный вектор по оси X для второго компонента

	double dXx_2 = arrData2[0];

	double dXy_2 = arrData2[1];

	double dXz_2 = arrData2[2];



	// единичный вектор по оси Z для второго компонента

	double dZx_2 = arrData2[6];

	double dZy_2 = arrData2[7];

	double dZz_2 = arrData2[8];



	// вектор переноса для второго компонента

	double dVx_2 = arrData2[9];

	double dVy_2 = arrData2[10];

	double dVz_2 = arrData2[11];



	// находим точку выбора у колонки, где 22.0  диаметр колонки, выраженный в миллиметрах

	double dV_X2 = dXx_2 * (22.0 / 2000.0) + dZx_2 * (75.0 / 1000) + dVx_2;

	double dV_Y2 = dXy_2 * (22.0 / 2000.0) + dZy_2 * (75.0 / 1000) + dVy_2;

	double dV_Z2 = dXz_2 * (22.0 / 2000.0) + dZz_2 * (75.0 / 1000) + dVz_2;



	// выбираем Face у колонки

	hres = swModelExt->SelectByID2(L"", strTypeObj, dV_X2, dV_Y2, dV_Z2, VARIANT_TRUE, 0, NULL, swSelectOptionDefault, &bres);	

	if(bres == VARIANT_FALSE)

	{

		strError = L"Поверхность у второго компонента не выбрана!";

		swApp->SendMsgToUser2(strError, swMbStop, swMbOk, &lresult);

		::CoUninitialize();

		return 1;

	}



	// создаем сопряжение концетричность

	long lMateError; //ошибка или нет при создании первого сопряжения

	IMate2 *swMate = NULL;	

	hres = swAssembly->AddMate3(swMateCONCENTRIC, swMateAlignCLOSEST, VARIANT_TRUE,  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,

								VARIANT_FALSE, &lMateError, &swMate);

	if(lMateError != swAddMateError_NoError)

	{

		strError = L"Первое сопряжение не получилось!!";

		swApp->SendMsgToUser2(strError, swMbStop, swMbOk, &lresult);

		::CoUninitialize();

		return 1;

	}



	swModel->ClearSelection2(VARIANT_TRUE);

	// Так как положение компонентов в сборке изменилось необходимо повторять все снова для новых сопряжений

	//====================================================================================



	//GetXFormComponent(swComponent_1, arrData1); // получаем матрицу преобразования для первого компонента - втулки

	//GetXFormComponent(swComponent_2, arrData2); // получаем матрицу преобразования для второго компонента - колонки

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

	//=====================================================================================

	hres = swModel->ClearSelection2(VARIANT_TRUE);

	hres = swModel->ViewZoomtofit2();	

	hres = swModel->ForceRebuild3(VARIANT_TRUE, &bres);



	::CoUninitialize();

	return 0;

}



void GetXFormComponent(IComponent2 *pComponent, double *dData)

{

	HRESULT hres;

	IMathTransform *swXForm = NULL;

	hres = pComponent->get_Transform2(&swXForm);



	VARIANT vArrayData;

	hres = swXForm->get_ArrayData(&vArrayData);



	SAFEARRAY *pSA = V_ARRAY(&vArrayData);

	double value;

	SafeArrayLock(pSA);

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

	{

		SafeArrayGetElement(pSA, &i, (VOID*)(&value));

		dData[i] = value;

	}

	SafeArrayUnlock(pSA);

	SafeArrayUnaccessData(pSA);

	SafeArrayDestroy(pSA);

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

ну дело не в разницы в ссылках! просто как программно получить ссылку на тот объект(деталь) которую я получаю просто загружаю его из файла например!

это нужно для того чтобы потом я мог построить сопряжения, и там где необходимо указывать сопрягаемые элементы я буду добираться до нужных мне (кромок, поверхностей, точек) через эту ссылку на объект!!!

=)

ну или как сборку из делфи сделать если я имею 3 файла с деталями!

Посмотрите пример из API SW2008:

"Add Component and Mate Example (VB)

This example shows how to add a component and a mate to an assembly.

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

' Preconditions: Open:

' <install_dir>\Program Files\SolidWorks\samples\tutorial\toolbox\lens_mount.sldasm

' Postconditions: The specified component (camtest.sldprt) and a mate

' are added to the assembly.

"

PS. ИМХО у Вас несколько путанные вопросы...

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

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

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

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

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

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

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

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

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

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

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



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