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

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

Добрый день! Пишу программу на C# в VS 2010 которая автоматически выполняет необходимые действия в SolidWorks и выполняет расчет в Simulation. Проблем с самим построением в Солиде особо нет, так как можно практически все записать через макросы, а вот в Simulation макросы не записываются. Если есть способ записать макрос с Simulation подскажите пожалуйста.

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

Так же в частности возник вопрос как запускать solid так, чтоб он загружал добавления (simulation)???

При таком запуске не загружаются добавления :

swApp = (SldWorks)Activator.CreateInstance(Type.GetTypeFromProgID("SldWorks.Application"));

Если делать запуск просто через EXEшник Солида то его нельзя скрыть, а мне нужно, что б он работал в фоновом режиме.

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


CLSID clsid;

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

HRESULT hres;

CoInitialize(NULL);

ISldWorks *swApp = NULL;

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

hres = swApp->put_UserControl(VARIANT_TRUE);

hres = swApp->put_Visible(VARIANT_TRUE);

CComBSTR bstrFileName(L"F:\\Kursovoi\\Kursovoi\\Сборка.asmdot");

CComBSTR bstrConfig(L"Default");

ISldWorksPtr SldWorks("SldWorks.Application");

IModelDoc2* swModel = NULL;

IAssemblyDoc* Asemb = NULL;

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

VARIANT_BOOL Vis= VARIANT_FALSE;

CComBSTR bstrFileName1(L"F:\\Крышка.SLDPRT");

hres =Asemb ->AddComponent(bstrFileName1,1,1,1,&Vis);

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

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

Здравствуйте, всех с праздником!! А подскажите пожалуйста как переместить активный вид на чертеже (задать его положение). Запись макроса не помогает. В справке пытался что-то по положению вида найти, не смог к сожалению. На VBA пишу.

Хотя бы какой запрос в поиск справки вводить, а то уж обыскался. Буду очень благодарен.
Ссылка на сообщение
Поделиться на других сайтах

При добавлении компонентов в сборку с помощью функции AddComponent5(,.....)

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

Работаю на С++

Один из вариантов. Компоненты позиционируются согласно arrayData_1 и arrayData_2.

Скрытый текст: Code C++

// Reaper_6.cpp : Defines the entry point for the console application.

//



#include "stdafx.h"

#import "sldworks.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids  //the SolidWorks type library

#import "swconst.tlb"  raw_interfaces_only, raw_native_types, no_namespace, named_guids  //the SolidWorks constant type library



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

{

	// добавление двух деталей в сборку. Только пример.

	// пути мои. Только для примера

	CComBSTR strFilePart_1 = L"g:\\Шпонка.SLDPRT";

	CComBSTR strFilePart_2 = L"g:\\Подкладка.SLDPRT";

	CComBSTR nameConfig = L"Default";

	CComBSTR strTemplateAsm = L"g:\\SolidWorks\\SW2011_Shvg\\Data\\templates\\Assembly.asmdot";

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



	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 1;

	}

	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;

	}



	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, nameConfig, 0.05, -0.03, 0.1, &swComponent_1); // добавляем первый компонент в сборку



	VARIANT vXForm;

	double arrayData_1[16]; 

	arrayData_1[0]=1.0;

	arrayData_1[1]=0.0;

	arrayData_1[2]=0.0;

	arrayData_1[3]=0.0;

	arrayData_1[4]=1.0;

	arrayData_1[5]=0.0;

	arrayData_1[6]=0.0;

	arrayData_1[7]=0.0;

	arrayData_1[8]=1.0;

	arrayData_1[9]=0.07;

	arrayData_1[10]=0.1;

	arrayData_1[11]=0.01;

	arrayData_1[12]=1.0;

	arrayData_1[13]=0.0;

	arrayData_1[14]=0.0;

	arrayData_1[15]=0.0;



	IMathTransform *swMathTransform = NULL;

	hres = swComponent_1->get_Transform2(&swMathTransform);



	hres = swMathTransform->get_ArrayData(&vXForm);



	SAFEARRAY *pSA = V_ARRAY(&vXForm);

	SafeArrayLock(pSA);

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

	{

		double value = arrayData_1[i];

		hres = SafeArrayPutElement(pSA, &i, (void*)&value);

	}



	hres = swMathTransform->put_ArrayData(vXForm);

	hres = swComponent_1->put_Transform2(swMathTransform); //



	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); // активируем документ сборки

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





	IComponent2 *swComponent_2 = NULL;

	hres = swAssembly->AddComponent4(strFilePart_2, nameConfig, 0.01, -0.05, 0.0, &swComponent_2); // добавляем второй компонент в сборку



	double arrayData_2[16]; 

	arrayData_2[0]=1.0;

	arrayData_2[1]=0.0;

	arrayData_2[2]=0.0;

	arrayData_2[3]=0.0;

	arrayData_2[4]=1.0;

	arrayData_2[5]=0.0;

	arrayData_2[6]=0.0;

	arrayData_2[7]=0.0;

	arrayData_2[8]=1.0;

	arrayData_2[9]=0.02;

	arrayData_2[10]=0.08;

	arrayData_2[11]=0.04;

	arrayData_2[12]=1.0;

	arrayData_2[13]=0.0;

	arrayData_2[14]=0.0;

	arrayData_2[15]=0.0;



	hres = swComponent_2->get_Transform2(&swMathTransform);



	hres = swMathTransform->get_ArrayData(&vXForm);



	pSA = V_ARRAY(&vXForm);

	SafeArrayLock(pSA);

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

	{

		double value = arrayData_2[i];

		hres = SafeArrayPutElement(pSA, &i, (void*)&value);

	}



	hres = swMathTransform->put_ArrayData(vXForm);

	hres = swComponent_2->put_Transform2(swMathTransform);



	hres = swModel->EditRebuild3(&bres);



	SafeArrayUnlock(pSA);

	SafeArrayDestroyData(pSA);

	SafeArrayUnaccessData(pSA);

	return 0;

}

arrayData - это ориентация модели на экране, так ведь? При изменении вида модели, изменяется матрица. Её ж не посчитать при вставке в сборку. Можно только прикидочно расставить детальки, например горизонтально.

Хотяяя...можно попробовать преобразовать клик мыши в пространстве сборки и вставить origin детали в это место. Скажите пожалуйста, я правильно понимаю эту IMathTransform?

Нет. В данном примере - это матрица расположение компонента в сборке.

Здравствуйте, всех с праздником!! А подскажите пожалуйста как переместить активный вид на чертеже (задать его положение). Запись макроса не помогает. В справке пытался что-то по положению вида найти, не смог к сожалению. На VBA пишу.

Syntax (OLE Automation)

position = View.Position (VB Get property)

View.Position = position (VB Set property)

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

Кто нибудь занимался этой проблемой?

Так а в чем проблема то?

Кстати, может вам исходники поискать? :wink:<noindex>http://fsapr2000.ru/index.php?showtopic=25...st&p=275314</noindex>

Нет. В данном примере - это матрица расположение компонента в сборке.

Тут я был не прав. Предполагал что нужна ориентация модели, воспроизведённая в сборку. (что-то вроде деталь повёрнута так-то так-то, и в таком же виде вставлена в сборку)

Кстати, можно же и без прогонки массива по variant, сразу в double - <noindex>http://help.solidworks.com/2012/english/ap...lusplus_com.htm</noindex>

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

Кстати, можно же и без прогонки массива по variant, сразу в double - <noindex>http://help.solidworks.com/2012/english/ap...lusplus_com.htm</noindex>

Если это будет аддон, то да. Если же на C++ будет реализован exe-шник, то такой вариант не пройдет. Я предыдущий пример и удалил из-за этого.
Ссылка на сообщение
Поделиться на других сайтах

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

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

Я так запускал, так тоже не будут работать Аддоны!

Я уже решил эту проблему по-другому, запускать любым способом, а потом отдельной командой запускать аддоны, если кому нужно будет, вот код :

string filename = "C:\\Program Files\\SolidWorks Corp\\SolidWorks\\Simulation\\cosworks.dll";

swApp = (SldWorks)Activator.CreateInstance(Type.GetTypeFromProgID("SldWorks.Application.20"));

swApp.UserControlBackground = false;

swApp.Visible = false;

int simul = swApp.LoadAddIn(filename);

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

Если правильно понял проблему.

P.S. Похоже, что с кодом я поторопился...

Я воспользовался вашим кодом единственное что пришлось заменить функции на

hres = swMathTransform->set_ArrayData(vXForm);

hres = swComponent->SetTransformAndSolve2(swMathTransform);

Всё работает

Вот так это работает

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

Я воспользовался вашим кодом единственное что пришлось заменить функции на

hres = swMathTransform->set_ArrayData(vXForm);

hres = swComponent->SetTransformAndSolve2(swMathTransform);

Всё работает

Тот первый код работает не корректно, если у вас exe-файл. Если снова получить MathTransform у уже установленного компонента, то вас ожидают совсем не те данные, что вы загнали в массив...
Ссылка на сообщение
Поделиться на других сайтах

Я их из dll вызываю

<noindex>Cae Solidworks</noindex>

Вот так

Предупреждать надо... :smile: Зачем же хотели использовать SAFEARRAY?
Ссылка на сообщение
Поделиться на других сайтах

Предупреждать надо... :smile: Зачем же хотели использовать SAFEARRAY?

Ещё такой вопрос

я назначаю свой материал из своей созданной базы материалов

hres = swModel->QueryInterface(IID_IPartDoc, (void**)&swPart);

hres = swPart->SetMaterialPropertyName2(strConfig, database, material);

Как мне поменять плотность материала на ту которая мне нужна. Например было 7850 а сделать 1650 например ?

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

Здравствуйте, всех с праздником!! А подскажите пожалуйста как переместить активный вид на чертеже (задать его положение). Запись макроса не помогает. В справке пытался что-то по положению вида найти, не смог к сожалению. На VBA пишу.

Syntax (OLE Automation)

position = View.Position (VB Get property)

View.Position = position (VB Set property)

Shvg, смотрел этот пример, но так и не понял как задавать координаты виду, пробую так, но не получается:

boolstatus = Part.Extension.SelectByID2("Чертежный вид4", "DRAWINGVIEW", 0.2825576685727, 0.5321152385946, 0, False, 0, Nothing, 0)

Set swView = swSelMgr.GetSelectedObject5(1)

vPos = swView.Position

Debug.Print " Pos = ("; 10; ", "; 10; ") mm"

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

Здравствуйте, всех с праздником!! А подскажите пожалуйста как переместить активный вид на чертеже (задать его положение). Запись макроса не помогает. В справке пытался что-то по положению вида найти, не смог к сожалению. На VBA пишу.

Shvg, смотрел этот пример, но так и не понял как задавать координаты виду, пробую так, но не получается:

boolstatus = Part.Extension.SelectByID2("Чертежный вид4", "DRAWINGVIEW", 0.2825576685727, 0.5321152385946, 0, False, 0, Nothing, 0)

Set swView = swSelMgr.GetSelectedObject5(1)

vPos = swView.Position

Debug.Print " Pos = ("; 10; ", "; 10; ") mm"

Два небольших примера. Делают одно и тоже.

Скрытый текст: Примеры

1-й пример

Option Explicit

Dim swApp As SldWorks.SldWorks

Dim swModel As ModelDoc2

Dim swDrawing As DrawingDoc

Dim swSheet As Sheet

Dim swView As SldWorks.View



' Только пример

Sub main()

	On Error GoTo LineError



	Set swApp = Application.SldWorks

	Set swModel = swApp.ActiveDoc

	If swModel Is Nothing Then Exit Sub

	Dim docType As Integer

	docType = swModel.GetType()

	If docType <> swDocDRAWING Then Exit Sub

	

	Set swDrawing = swModel

	Set swView = swDrawing.GetFirstView

	

	Do While Not swView Is Nothing

		Dim typeView As Integer

		typeView = swView.Type

		   

		If typeView <> swDrawingSheet Then

			Dim nameView As String

			nameView = swView.Name

			If nameView = "Drawing View1" Then

				Dim posView As Variant

				posView = swView.Position ' Позиция вида с именем "Drawing View1"

				

				Dim newPos(1) As Double

				newPos(0) = 0.2

				newPos(1) = 0.3

				

				swView.Position = newPos ' Задаем новую позицию вида с именем "Drawing View1"

				

				Exit Do

			End If

		End If

				

		Set swView = swView.GetNextView

	Loop

	swModel.EditRebuild3

LineError:



End Sub

2-й пример

Option Explicit

Dim swApp As SldWorks.SldWorks

Dim swModel As ModelDoc2

Dim swDrawing As DrawingDoc

Dim swSheet As Sheet

Dim swView As SldWorks.View



' Только пример

Sub main()

	On Error GoTo LineError

	

	Set swApp = Application.SldWorks

	Set swModel = swApp.ActiveDoc

	If swModel Is Nothing Then Exit Sub

	Dim docType As Integer

	docType = swModel.GetType()

	If docType <> swDocDRAWING Then Exit Sub

	

	Dim bres As Boolean

	bres = swModel.Extension.SelectByID2("Drawing View1", "DRAWINGVIEW", 0#, 0#, 0#, False, 0, Nothing, 0)

	

	If bres = False Then Exit Sub

	

	Dim swSelMgr As SldWorks.SelectionMgr

	Set swSelMgr = swModel.SelectionManager

	Set swView = swSelMgr.GetSelectedObject5(1)

	

	Dim posView As Variant

	posView = swView.Position ' Позиция вида с именем "Drawing View1"

	

	Dim newPos(1) As Double

	newPos(0) = 0.2

	newPos(1) = 0.3

	

	swView.Position = newPos  'Задаем новую позицию вида с именем "Drawing View1"

	

	swModel.ClearSelection2 True

	swModel.EditRebuild3

LineError:



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

Два небольших примера. Делают одно и тоже.

Скрытый текст: Примеры

1-й пример

Option Explicit

Dim swApp As SldWorks.SldWorks

Dim swModel As ModelDoc2

Dim swDrawing As DrawingDoc

Dim swSheet As Sheet

Dim swView As SldWorks.View



' Только пример

Sub main()

	On Error GoTo LineError



	Set swApp = Application.SldWorks

	Set swModel = swApp.ActiveDoc

	If swModel Is Nothing Then Exit Sub

	Dim docType As Integer

	docType = swModel.GetType()

	If docType <> swDocDRAWING Then Exit Sub

	

	Set swDrawing = swModel

	Set swView = swDrawing.GetFirstView

	

	Do While Not swView Is Nothing

		Dim typeView As Integer

		typeView = swView.Type

		   

		If typeView <> swDrawingSheet Then

			Dim nameView As String

			nameView = swView.Name

			If nameView = "Drawing View1" Then

				Dim posView As Variant

				posView = swView.Position ' Позиция вида с именем "Drawing View1"

				

				Dim newPos(1) As Double

				newPos(0) = 0.2

				newPos(1) = 0.3

				

				swView.Position = newPos ' Задаем новую позицию вида с именем "Drawing View1"

				

				Exit Do

			End If

		End If

				

		Set swView = swView.GetNextView

	Loop

	swModel.EditRebuild3

LineError:



End Sub

2-й пример

Option Explicit

Dim swApp As SldWorks.SldWorks

Dim swModel As ModelDoc2

Dim swDrawing As DrawingDoc

Dim swSheet As Sheet

Dim swView As SldWorks.View



' Только пример

Sub main()

	On Error GoTo LineError

	

	Set swApp = Application.SldWorks

	Set swModel = swApp.ActiveDoc

	If swModel Is Nothing Then Exit Sub

	Dim docType As Integer

	docType = swModel.GetType()

	If docType <> swDocDRAWING Then Exit Sub

	

	Dim bres As Boolean

	bres = swModel.Extension.SelectByID2("Drawing View1", "DRAWINGVIEW", 0#, 0#, 0#, False, 0, Nothing, 0)

	

	If bres = False Then Exit Sub

	

	Dim swSelMgr As SldWorks.SelectionMgr

	Set swSelMgr = swModel.SelectionManager

	Set swView = swSelMgr.GetSelectedObject5(1)

	

	Dim posView As Variant

	posView = swView.Position ' Позиция вида с именем "Drawing View1"

	

	Dim newPos(1) As Double

	newPos(0) = 0.2

	newPos(1) = 0.3

	

	swView.Position = newPos  'Задаем новую позицию вида с именем "Drawing View1"

	

	swModel.ClearSelection2 True

	swModel.EditRebuild3

LineError:



End Sub
Спасибо за помощь, все работает! Только интересно, что обрезанные виды позиционируются относительно тех границ которые были у вида до обрезки, а не относительн границ вида после обрезки. Изменено пользователем NUMPL
Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

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

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

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

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

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

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

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




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