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

Разработка приложения под 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 пользователей

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



  • Сообщения

    • IGor2D
      По итогу...: По гарантии приехали и поправили только точность реза, остальное не смогли исправить, нужен инженер с HSG. Глючный однако китаец, пытается сам себя сломать.
    • Gmv
      По кнопке FTP стойка имеет 6 страниц для трех разных хостов. Где можно указать IP , имя, пароль 1страница. каталог 2 страница. Больше настроек не нашел.
    • gudstartup
      на фануке настраиваете доступ по ftp на соответствующей вкладке  и также расшариваете папку  вашим сервером и все прекрасно работает.
    • gudstartup
      симулятор предполагает взаимодействие как с чпу так и со станком посредством другой plc программы иначе вам придется самому управлять входами и выходами а это непросто.    
    • Gmv
      У кого есть опыт организации FTP именно на станке? Стойка 0i-MF plus   Сейчас пока сервер настроен на компе, и то не до конца. файлы видны, извлечь их или скопировать в память станка не выходит. Но операторы уже сразу возмущены,  им проще бегать с USB флешкой и нажимать одну кнопку, чем прыгать по папкам. На хаасе это реализовано классно, он создает сетевой диск и полный доступ и со стойки с пк. Хотелось бы подобного.
    • Guhl
      Я нормально проекты писал и отлаживал на эмуляторе Балт-Систем На Heidenhain, насколько я понял, работает симулятор с их сайта в связке с PLC design @gudstartup пользовался этим вот в этой ветке
    • ID_Hacker
      Ну уж балт-систем то не надо сюда. Там такое ущербное всё, что аж страшно вспомнить. Haidenhain эмулятор где взять, подскажете? А как отработать взаимодействие между NC и PLC, действия где работают и оси и механизмы электроавтоматики. Сам хочу попробовать Run my virtual machine, да всё времени нет.
    • Bot
      Данное приложение разработано на языке Visual Basic с использованием программного интерфейса NX Open API и предназначено для использования в САПР Siemens NX, начиная с версии 2000. Стиль интерфейса пользователя идентичен стилю САПР Siemens NX. View the full article
    • Jesse
      @ГЕЛА Ещё можно посчитать в балках и учесть влияние отверстия через коэффициент концентрации напряжений..) Но у вас отверстие на всю стенку, так что лучше, проще и быстрее посчитать всё это дело в оболочках как выше сказали. Скругления перехода от стенки к полке удалите и в запас считайте.
    • 5axisCNC
      Можно плоскость дна задать множеством вариантов например точка направление
×
×
  • Создать...