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

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

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




  • Сообщения

    • Jesse
      посмотрел. По дефолту нормировка DFT идёт на 1/sqrt(N), где N - число отсчётов. Сделал нормировку на 1/N Получил амплитуду теперь меньше единицы.... у вас там maxima)) да и контекст долго читать. вы нормируете на логарифм от числа отсчётов?)
    • AlexKaz
      Стр. 89-90 https://elib.pstu.ru/docview/6701 1/(2*Pi) - это корректировка оси абсцисс, а не ординат.
    • Борман
      Если так то да. Я про статически-эквивалентный метод говорил там выше.
    • gudstartup
      @gudi продублировали ответы по теме а зачем неясно....
    • ANT0N1DZE
      Упрощенный план действий: Начните со стр. 155 https://www.utgt73.ru/uploads/biblioteka/fizika 10.pdf Если будет вращаться быстро и не в вакууме, то надо будет учесть "парус" этого тела, там сопротивление газа зависит от скорости движения. Это уже примерно 1 курс университета (тоже гуглится спокойно). 
    • MagicNight
      Заметил такую особенность, что в PowerMill v6 (возможно и в других тоже) происходит следующее... Создаю NC-файл и туда сбрасываю траектории (около 10-15 на разные фрезы), на выходе некоторые траектории не прописывает вкл охлаждения. То есть в графе Охлаждение на одну из 10-15 траекторий пишет НЕТ, на всех остальных -Стандартное (то есть да) Получается, что из, условно десяти траекторий, одна или две прописываются без включения СОЖ. Но что интересно по отдельности программы выходят с включенной СОЖ, всегда! Не могу понять зависимость с этим. Кто-нибудь сталкивался с этим?
    • ЮрЮрыч
      Вам нужно просто общее количество или оптимальную раскладку для резки наподобии нестинга?
    • Jesse
      да. Забыл добавить. Я там в тестовом примере ещё сверху шум накинул небольшой амплитуды, в 10 раз меньше чем основной сигнал. Если шум убрать, то получится что амплитуда дискретного фурье спектра растёт примерно в sqrt(N2/N1) раз, где N2 - число отсчётов для правого графика, а N1 - для левого. Но не суть.. Мой главный вопрос как получить "рабочую", правильную амплитуду DFT, которую можно было бы вбить в прогу?   не, у меня более простой второй вариант) вот когда скажут заморочиться с ансамблем и случайными процессами, тогда и будуда и комиссии если что-то подобное пробубнить, то мне точно прилетит..   Harmonic Response. На резонанс проверить.   вот сейчас только в голову пришло! Там ведь поправочные коэффы в DFT используются! Типа 1/sqrt(2*Pi) чё т такое. Пойду курить вольфрам
    • Orchestra2603
      Я, честно скажу, не знаю как на практике это проходит, что в нормах пишут и т.д. Стоит задача провести вероятностный анализ (вероятност ьпревышения пределеа текучести, например), или надо просто посчитать динамику на одну вот эту вот историю ускорений, и все? Второй вариант проще, но по-правильному, наверное надо, как в первом варианте.   а какой анализ вы хотите делать?   Если больше отсчетов по частоте, то повышается разрешение в частотной области, и просто пик становится более резким. В предельном случае будет просто одно значение в районе частоты действия силы, а вокруг него везде нули. Но, когда разрешение падает, то амплитуда с пика "сползает" и "растекается" на соседние частоты. Но сама сумма в силу равенства Парсеваля, как вы правильно сказали,  должна быть такой же.   Это очень странно. Впечатление такое, что как будто где-то какой-то косяк с БПФ. Если в начале во времени был синус с амплитудой 1, то на спектр еможет быть 1 (если однсторонний спектр), либо 1/2, если двухстронний спектр. Может, оконная функция какая-то странная? Надо разбираться...  Так а если он задаст на уровне земли как кинематическое возбуждение опорного контура? Вроде же норм... Или речб о том, чтобы убрать из модели опорную конструкцию, на которой держится оборудовнаие?
    • Борман
      и не только. При отсутствии отраслевого ГОСТа, пользуйтесь СП 14.13330.2018. Там найдете нужные коэффициенты.
×
×
  • Создать...