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

Разработка приложения под Solidworks на языке C++


reaper

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

Как выглядит процедура получения тела вращения в Solidworks, написанная на языке С++?

Нужно получить тело вращения - тор. Задать ось, нарисовать окружность - это всё уже сделано. Как прокрутить эту окружность вокруг заданной оси вращения.

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


Как выглядит процедура получения тела вращения в Solidworks, написанная на языке С++?

Нужно получить тело вращения - тор. Задать ось, нарисовать окружность - это всё уже сделано. Как прокрутить эту окружность вокруг заданной оси вращения.

Включаете запись макросов и получаете:

' C:\DOCUME~1\9335~1\LOCALS~1\Temp\swx736\Macro1.swb - macro recorded on 10/30/08 by Администратор

' ******************************************************************************

Dim swApp As Object

Dim Part As Object

Dim SelMgr As Object

Dim boolstatus As Boolean

Dim longstatus As Long, longwarnings As Long

Dim Feature As Object

Sub main()

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc

Set SelMgr = Part.SelectionManager

boolstatus = Part.Extension.SelectByID2("Arc1", "SKETCHSEGMENT", 0.01238353671591, 0.008192185827446, 0, False, 0, Nothing, 0)

boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 0.000381031898951, 0.01924211089702, 0, True, 0, Nothing, 0)

boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 0, 0, 0, True, 0, Nothing, 0)

Part.ShowNamedView2 "*Trimetric", 8

Part.ClearSelection2 True

boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 0, 0, 0, False, 4, Nothing, 0)

boolstatus = Part.Extension.SelectByID2("Sketch2", "SKETCH", 0, 0, 0, True, 0, Nothing, 0)

Part.FeatureManager.FeatureRevolve 6.28318530718, False, 0, 0, 0, 1, 1, 1 <<< ================Вот Ваша функция

Part.SelectionManager.EnableContourSelection = 0

End Sub

Потом смртрите хэлп API SW на предмет поиска строки "FeatureRevolve", изучаетет необходимые параметры

и получаете результ.

Можно для начала и на VB написать...

Еще, где-то видел транслятор исходников с VB на С++.

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

Как выглядит процедура получения тела вращения в Solidworks, написанная на языке С++?

Примерно так (exe файл, консоль):

#include "stdafx.h"



int _tmain()

{

	HRESULT hres;

	CoInitialize(NULL);

	CLSID clsid;

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

	

	ISldWorks *swApp;

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

	if(swApp == NULL)

	{

		::CoUninitialize();

		return 1;

	}

	IModelDoc2 *swModel;

	hres = swApp->get_IActiveDoc2(&swModel);

	if(swModel == NULL)

		return 1;

	IModelDocExtension *swModelExt;

	hres = swModel->get_Extension(&swModelExt);



	IFeatureManager *swFeatMgr;

	hres = swModel->get_FeatureManager(&swFeatMgr);



	ISketch *swSketch;

	hres = swModel->IGetActiveSketch2(&swSketch);



	VARIANT_BOOL bres;

	if(swSketch == NULL)

	{

		hres = swModelExt->SelectByID2(L"Font Plane", L"Plane", 0.0, 0.0, 0.0, VARIANT_FALSE, 0, NULL, swSelectOptionDefault, &bres);

		hres = swModel->InsertSketch2(VARIANT_TRUE);

	}



	ISketchManager *swSketchMgr;

	hres = swModel->get_SketchManager(&swSketchMgr);



	ISketchSegment *swSketchSegment;

	hres = swSketchMgr->CreateLine(0.0, 0.0, 0.0, 0.0, 0.05, 0.0, &swSketchSegment);

	hres = swSketchSegment->put_ConstructionGeometry(VARIANT_TRUE);



	hres = swSketchMgr->CreateCircleByRadius(0.15, 0.05, 0.0, 0.01, &swSketchSegment);



	IFeature *swFeature;

	hres = swFeatMgr->FeatureRevolve(6.2831853071796, VARIANT_FALSE, 0.0, swRevolveTypeOneDirection, 0, VARIANT_TRUE, VARIANT_TRUE, VARIANT_TRUE, &swFeature);





	CoUninitialize();

	return 0;

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

Я когда ввёл функцию hres = swSketchSegment->put_ConstructionGeometry(VARIANT_TRUE); то выдаётся такой ответ

Debug Assertion Failed

........................

..........................

..........................

.......................

Expression : p! = 0

Что делать ?

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

Что делать ?

Получить вашу ситуацию, к сожалению, не удалось. Если речь идет о моем примере, то он рабочий, хотя и не совсем корректный. Я намеренно опустил несколько проверок. Пример был скомпилирован в VS2003 под SW2008.
Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...

Получить вашу ситуацию, к сожалению, не удалось. Если речь идет о моем примере, то он рабочий, хотя и не совсем корректный. Я намеренно опустил несколько проверок. Пример был скомпилирован в VS2003 под SW2008.

А вы не могли бы скинуть мне на e-mail , рабочий файл с этой программой, если я вам в личку напишу свой адрес ?
Ссылка на сообщение
Поделиться на других сайтах

А вы не могли бы скинуть мне на e-mail , рабочий файл с этой программой, если я вам в личку напишу свой адрес ?

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

Здраствуйте!

Функция работает сам использовал

Part.FeatureManager.FeatureRevolve 6.28318530718, False, 0, 0, 0, 1, 1, 1 <<< ================Вот Ваша функция

А вот хэлп API SW несовсем понятен, у меня English плохой

Случайно у Вас нет инфы по API SW на русском? И для VBA для библиотеки API SW?

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

Случайно у Вас нет инфы по API SW на русском? И для VBA для библиотеки API SW?

На русском ее нет. Но неплохо может помочь Promt, вернее его модуль для перевода Internet-страниц.
Ссылка на сообщение
Поделиться на других сайтах

Да большое спасибо за помощь, пример выложенный здесь работает.

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

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

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

Если ломаная линия рисуется програмно, то разницы с предыдущим примером нет. Если же она уже нарисована, то на помощь придет функция: status = ModelDocExtension->SelectByID2 ( Name, Type, X, Y, Z, Append, Mark, Callout, SelectOption, retval ), которой выделяете контур и ось, вокруг которой будет производиться вращение...

З.Ы. Не пробовал. Мысли вслух.

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

На русском ее нет. Но неплохо может помочь Promt, вернее его модуль для перевода Internet-страниц.

Спасибо я Lingvo пользуюсь.

У меня такой вопрос есть, по приведенному коду макроса:

'выбор плоскости для создания эскиза выреза

Part.ClearSelection2 True

boolstatus = Part.Extension.SelectByID2("Сверху", "PLANE", 0, 0, 0, False, 0, Nothing, 0)

Part.ClearSelection2 True

'создание окружности для выреза Эскиз3

Part.CreateCircle Laine3, Radiuss, 0, Laine3, RadVyrez, 0

Part.ClearSelection2 True

Part.SketchManager.InsertSketch True

Почему-то упрорно выбирает плоскость "Спереди", а не "Сверху" как указанно и строит эскиз не в нужной плоскости.

Код записал ч/з макросы, а потом откоректировал.

Что можно сделать или исправить чтобы выбирал нужную плоскость для эскиза?

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

Почему-то упрорно выбирает плоскость "Спереди", а не "Сверху" как указанно и строит эскиз не в нужной плоскости.

Код записал ч/з макросы, а потом откоректировал.

Что можно сделать или исправить чтобы выбирал нужную плоскость для эскиза?

Для начала проверьте в дебаггере возврщаемое значение функции, выделенной болдом, т.е. значение переменной boolstatus. Оно должен быть True. Если False, то, по всей видимости неправильная запись имени плоскости. Я бы порекомендовал из свойств плоскости скопировать в буфер ее имя и вставить в макрос и посмотреть. Если же True, то закомментируйте строку ниже, а то у вас получается, что вы выделили плоскость "Сверху" и тут же снимаете выделение. А SW берет другую плоскость, которая по умолчанию.
Ссылка на сообщение
Поделиться на других сайтах

Для начала проверьте в дебаггере возврщаемое значение функции, выделенной болдом, т.е. значение переменной boolstatus. Оно должен быть True. Если False, то, по всей видимости неправильная запись имени плоскости. Я бы порекомендовал из свойств плоскости скопировать в буфер ее имя и вставить в макрос и посмотреть. Если же True, то закомментируйте строку ниже, а то у вас получается, что вы выделили плоскость "Сверху" и тут же снимаете выделение. А SW берет другую плоскость, которая по умолчанию.

Большое СПАСИБО, сделал как Вы сказали РАБОТАЕТ
Ссылка на сообщение
Поделиться на других сайтах

Если ломаная линия рисуется програмно, то разницы с предыдущим примером нет. Если же она уже нарисована, то на помощь придет функция: status = ModelDocExtension->SelectByID2 ( Name, Type, X, Y, Z, Append, Mark, Callout, SelectOption, retval ), которой выделяете контур и ось, вокруг которой будет производиться вращение...

З.Ы. Не пробовал. Мысли вслух.

Я сложный замкнутый контур рисовал также программно с помощью нескольких функций CreateLine. Но я попробую ещё раз.
Ссылка на сообщение
Поделиться на других сайтах

To reaper

Если в моем примере вместо функции

hres = swSketchMgr->CreateCircleByRadius(0.15, 0.05, 0.0, 0.01, &swSketchSegment);
вставить, для примера, хотя бы

hres = swSketchMgr->CreateLine(0.05, 0.05, 0.0, 0.08, 0.08, 0.0, &swSketchSegment);

	hres = swSketchMgr->CreateLine(0.08, 0.08, 0.0, 0.02, 0.08, 0.0, &swSketchSegment);

	hres = swSketchMgr->CreateLine(0.02, 0.08, 0.0, 0.05, 0.05, 0.0, &swSketchSegment);
то все работает.
Ссылка на сообщение
Поделиться на других сайтах

Кто-нибудь может помочь? Такой вопрос при записи макроса для следующей цели: из оболочки SW открывается модуль "Деталь..." то никакой код на это событие незаписывается. А мне-бы хотелось его получить. Никто несталкивался с такой проблемой? :wallbash:

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

To Genya_ms

А какой код вам необходимо получить? Если вы, хотите что-то сделать при создании нового файла или при открытии существующего, то необходимо подписаться на события: при создании нового - status = FileNewPreNotify ( docType, templateName) или status = FileNewNotify2 ( newDoc , docType , templateName ), при окрытии существующего - status = FileOpenNotify2 ( FileName ) или status = FileOpenPostNotify ( FileName)

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

А какой код вам необходимо получить? Если вы, хотите что-то сделать при создании нового файла или при открытии существующего, то необходимо подписаться на события: при создании нового - status = FileNewPreNotify ( docType, templateName) или status = FileNewNotify2 ( newDoc , docType , templateName ), при окрытии существующего - status = FileOpenNotify2 ( FileName ) или status = FileOpenPostNotify ( FileName)

Хочу создать "Новое трехмерное представление одного компонента": status = FileNewPreNotify ( docType, templateName)

docType будет = Деталь1.part - ?

а templateName = False если делать без шаблона - ?

или или status = FileNewNotify2 ( newDoc , docType , templateName )

newDoc - название детали с путем ее сохранения?

событие status - необходимо прописать как Dim status As Object - ?

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

Спасибо за советы всё получилось как надо. Ешё такой вопрос, как из приложения создать новую деталь. Я пишу функцию

#include "stdafx.h"

int _tmain()

{

HRESULT hres;

CoInitialize(NULL);

CLSID clsid;

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

ISldWorks *swApp;

IDispatch *swModel;

IModelDoc2 *swModel1;

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

if(swApp == NULL)

{

::CoUninitialize();

return 1;

}

CComBSTR sPartName(L"C:\Program Files\SolidWorks\data\templates\Деталь.prtdot");

CComBSTR sDefaultConfiguration(L"Default");

VARIANT_BOOL nRetval = VARIANT_TRUE;

long lErrors;

CComPtr<ISelectionMgr> swSlt;

CComPtr<IModelView> swView;

CComPtr<IModelDocExtension> swDocExt;

long lWarnings;

long lMateError;

swApp->NewDocument(sPartName,0,0,0,&swModel);

swApp->IActivateDoc3 ( sAssemblyName, 1, &lErrors, &swModel1 );

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

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

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

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

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

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

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

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

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

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

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




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