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

Скругление трех сплайнов


AlexeyN

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

Помогите, пожалуйста, скруглить дугой окружности носик и хвостик профиля пера лопатки (профиль не на плоскости). Сплайны на концах имеют общие точки и в месте скругления расположены буквой "П". Посередине прямая. Я программирую на С, но на С можно скруглить только 2 линии. Хочу научиться программировать на С++, но в папке UGOpen только 3 примера. Может кто-нибудь подскажет где найти примеры программ на С++ или литературу по этой теме (желательно на русском)?

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


Помогите, пожалуйста, скруглить дугой окружности носик и хвостик профиля пера лопатки (профиль не на плоскости). Сплайны на концах имеют общие точки и в месте скругления расположены буквой "П". Посередине прямая. Я программирую на С, но на С можно скруглить только 2 линии. Хочу научиться программировать на С++, но в папке UGOpen только 3 примера. Может кто-нибудь подскажет где найти примеры программ на С++ или литературу по этой теме (желательно на русском)?

Все это решается не слишком сложно

Из UG испоьзуется функция расчета длины от точки до объекта

Остальное реализуется с помощью обычной вычислительной математики

Как правило это решение методом итераций

Я как-то скруглял 3 сплайна лежащих на поверхности вращения (профиль пера ЦК)

ничего сложного там нет но код получается достаточно длинный

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

Все это решается не слишком сложно

Из UG испоьзуется функция расчета длины от точки до объекта

Остальное реализуется с помощью обычной вычислительной математики

Как правило это решение методом итераций

Я как-то скруглял 3 сплайна лежащих на поверхности вращения (профиль пера ЦК)

ничего сложного там нет но код получается достаточно длинный

Спасибо за ответ, вы предложили один из вариантов решения. Я решил эту задачу без UG на плоскости тоже методом итераций и вычислением кратчайшего расстояния от точки до сплайна, написал функцию интерполяции на плоскости, но мне хотелось бы использовать NXOpen С++, чтобы попутно научиться на нем программировать. Есть такая функция: NXOpen::Sketch::Fillet, но мне не понятно много, например как задать последний параметр vector<NXOpen::SketchConstraint *> Constraints ? И как заполнить значениями конструкцию vector <тип NX> ?

В пограмме: vector <NXOpen::Arc *> nxArc =NXOpen::Sketch::Fillet(s1,s2,s3,&p1,&p2,&p3,10,NXOpen::Sketch::TrimInputOptionTrue,NXOpen::Sketch::DeleteThirdCurveOptionTrue,NXOpen::Ske

tch::CreateDimensionOptionTrue,NXOpen::Sketch::AlternateSolutionOptionTrue,&Constraints);

Ругается на "Constraints" и на "vector <NXOpen::Arc *> nxArc =" .

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

Спасибо за ответ, вы предложили один из вариантов решения. Я решил эту задачу без UG на плоскости тоже методом итераций и вычислением кратчайшего расстояния от точки до сплайна, написал функцию интерполяции на плоскости, но мне хотелось бы использовать NXOpen С++, чтобы попутно научиться на нем программировать. Есть такая функция: NXOpen::Sketch::Fillet, но мне не понятно много, например как задать последний параметр vector<NXOpen::SketchConstraint *> Constraints ? И как заполнить значениями конструкцию vector <тип NX> ?

В пограмме: vector <NXOpen::Arc *> nxArc =NXOpen::Sketch::Fillet(s1,s2,s3,&p1,&p2,&p3,10,NXOpen::Sketch::TrimInputOptionTrue,NXOpen::Sketch::DeleteThirdCurveOptionTrue,NXOpen::Ske

tch::CreateDimensionOptionTrue,NXOpen::Sketch::AlternateSolutionOptionTrue,&Constraints);

Ругается на "Constraints" и на "vector <NXOpen::Arc *> nxArc =" .

Я не вижу смысла изучать эту библиотеку

В UGOPENPP на мой взгляд нормально спроектированы только классы для работы со Styler

Почему я считаю что нет смысла этим пользоваться:

1) Все равно от стандартных С функций не уйти - в C++ пока просто недостаточно функциональности Так зачем все мешать в кучу

2) Классы спроектированы плохо Такое впечатление что люди сами проектируя эти классы изучали C++

Примеры: В самой первой версии UGOPENPP был такой класс UgArray (зачем он был написан?) - В следующей версии его заменили на стандартный std::vector

Также можно посмотреть на реализацию exception - зачем он реализован без использования std::exseption

Не продумана совместимость библиотеки со стандартным C - кто мешал сделать оператор преобразования типа в классах к tag_t

чтобы можно было использовать эти классы как параметры в C функциях

Можно продолжать и дальше но основной аргумент они эти классы мне просто не нравятся - слишком сложно неудобно

3) При запуске приложения которое использует эти техногогии скорее всего при отладке Ты каждый раз будешь вынужден перезапускать UG или переименовывать dll

Мне это делать просто лень

То что касается Твоих вопросов то могу для начала порекомендовать книжку Леен Аммерааль STL для программистов на C++., Пер. с англ.

Она наиболее проста для начала работы с STL

Поищи в инете она была в djvu

У меня она тоже есть

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

Я не вижу смысла изучать эту библиотеку

В UGOPENPP на мой взгляд нормально спроектированы только классы для работы со Styler

Почему я считаю что нет смысла этим пользоваться:

1) Все равно от стандартных С функций не уйти - в C++ пока просто недостаточно функциональности Так зачем все мешать в кучу

2) Классы спроектированы плохо Такое впечатление что люди сами проектируя эти классы изучали C++

Примеры: В самой первой версии UGOPENPP был такой класс UgArray (зачем он был написан?) - В следующей версии его заменили на стандартный std::vector

Также можно посмотреть на реализацию exception - зачем он реализован без использования std::exseption

Не продумана совместимость библиотеки со стандартным C - кто мешал сделать оператор преобразования типа в классах к tag_t

чтобы можно было использовать эти классы как параметры в C функциях

Можно продолжать и дальше но основной аргумент они эти классы мне просто не нравятся - слишком сложно неудобно

3) При запуске приложения которое использует эти техногогии скорее всего при отладке Ты каждый раз будешь вынужден перезапускать UG или переименовывать dll

Мне это делать просто лень

То что касается Твоих вопросов то могу для начала порекомендовать книжку Леен Аммерааль STL для программистов на C++., Пер. с англ.

Она наиболее проста для начала работы с STL

Поищи в инете она была в djvu

У меня она тоже есть

Если можно, скинь книгу+примеры для нее на email nuzn2 собака mail.ru, в инете ее уже нет, старая. Спасибо.
Ссылка на сообщение
Поделиться на других сайтах

Если можно, скинь книгу+примеры для нее на email nuzn2 собака mail.ru, в инете ее уже нет, старая. Спасибо.

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

Книжку я послал

Спасибо за книгу! Читаю и пытаюсь применить на практике. Пробую построить сплайн:

#ifdef WIN32#define USE_MFC#endif#ifdef USE_MFC#include <afxdlgs.h>#include <afx.h>#endif#include <NXOpen/Session.hxx>#include <NXOpen/Part.hxx>#include <NXOpen/PartCollection.hxx>#include <NXOpen/Point.hxx>#include <NXOpen/PointCollection.hxx>#include <NXOpen/Curve.hxx>#include <NXOpen/Spline.hxx>#include <NXOpen/Sketch.hxx>#include <Ug_spline.hxx>#include <fstream>using namespace NXOpen;//using namespace UGOpen;using namespace std;/* Include files */#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )#   include <strstream>#   include <iostream>    using std::ostrstream;    using std::endl;        using std::ends;    using std::cerr;#else#   include <strstream.h>#   include <iostream.h>#endif#include <uf.h>#include <uf_ui.h>#include <uf_exit.h>#include <uf.h>#include <uf_exit.h>#include <uf_ui.h>#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )#   include <strstream>#   include <iostream>    using std::ostrstream;    using std::endl;        using std::ends;    using std::cerr;#else#   include <strstream.h>#   include <iostream.h>#endifstatic void PrintErrorMessage( int errorCode );static void PrintErrorMessage( const char* );extern DllExport void ufusr( char *parm, int *returnCode, int rlen ){	int i;	bool is_periodic=false;    int errorCode = UF_initialize();    Session *theSession = Session::GetSession();    Part *workPart = theSession->Parts()->Work();    if ( workPart == NULL )        workPart = theSession->Parts()->NewDisplay("File2Points", Part::UnitsMillimeters);	vector <double> param;	vector <Point3>  points;	for (i=0;i<5;i++){	   param[i]=i/4;	   points[i]=Point3::Point3(i,i,i);	}    const UgObject* part_or_obj=UgSession::getWorkPart();	UgSpline *spline=UgSpline::create(false,4,&points,&param,*part_or_obj);           /* Terminate the API environment */        errorCode = UF_terminate();  //  }    /* Print out any error messages */    PrintErrorMessage( errorCode );}extern int ufusr_ask_unload( void ){    return(UF_UNLOAD_IMMEDIATELY);}static void PrintErrorMessage( int errorCode ){    if ( 0 != errorCode )    {        /* Retrieve the associated error message */        char message[133];        UF_get_fail_message( errorCode, message );        /* Print out the message */        UF_UI_set_status( message );        /* Construct a buffer to hold the text. */        ostrstream error_message;        /* Initialize the buffer with the required text. */        error_message << endl                      << "Error:" << endl                      << message                      << endl << endl << ends;        /* Write the message to standard error */        PrintErrorMessage(error_message.str());    }}static void PrintErrorMessage( const char* msg ){#ifdef WIN32    static bool consoleInitialized = false;    if ( !consoleInitialized )    {        AllocConsole();        freopen("conout$", "w", stdout);    	freopen("conout$", "w", stderr);        consoleInitialized = true;    }#endif    cerr << msg;}

Но выдает такую ошибку:

В чем дело? :wallbash:

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

Ты перепутал указатель на объект и ссылку на объект.

попробуй так

UgSpline *spline=UgSpline::create(false,4,points,param,part_or_obj);

ЗЫ !!!!!!!!!!! И не используйте Debug режим, если используется хотя бы один объект

из STL ( например std::vector <Type> как в данном случае ).

!!!! ИСПОЛЬЗУЙТЕ ТОЛЬКО RELEASE Версию сборки!!!!!

Regardzzz ...

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

Спасибо за книгу! Читаю и пытаюсь применить на практике. Пробую построить сплайн:

1) Я бы все таки не злоупотреблял директивой using - если проекты будут большие то можно легко поиметь конфликты

Напримет с типом std::vector

2) При работе с UG и использовании STL нельза собирать проект в debug так как UG собрано в release

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

Спасибо всем за ответы. Скомпелировалось без ошибок:

НО! при запуске отладки выдает ошибку:

Unhandled exception at 0x7c964ed1 in ugraf.exe: 0xC0000005: Access violation. :sad:

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

Спасибо всем за ответы. Скомпелировалось без ошибок:

------ Build started: Project: fillet, Configuration: Release Win32 ------

Compiling...

fillet.cpp

WINVER not defined. Defaulting to 0x0502 (Windows Server 2003)

.\fillet.cpp(123) : warning C4996: 'freopen' was declared deprecated

E:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(245) : see declaration of 'freopen'

Message: 'This function or variable may be unsafe. Consider using freopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

.\fillet.cpp(124) : warning C4996: 'freopen' was declared deprecated

E:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(245) : see declaration of 'freopen'

Message: 'This function or variable may be unsafe. Consider using freopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

Build log was saved at "file://e:\nuzn\PROG\NX5\fillet\fillet\Release\BuildLog.htm"

fillet - 0 error(s), 2 warning(s)

========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

НО! при запуске отладки выдает ошибку:

Unhandled exception at 0x7c964ed1 in ugraf.exe: 0xC0000005: Access violation. :sad:

Почему не используешь в программе try {} catch(...)

Посмотри внимательно на этот фрагмент

Если Ты внимательно читал книжку то мог бы понять что размер массивов не определен

vector <double> param; vector <Point3> points;

for (i=0;i<5;i++){ param=i/4; points=Point3::Point3(i,i,i); }

for (i=0;i<5;i++){ param.push_back(i/4);

или

vector <double> param(5)

Более безопасно но медленнее испоьзовать at(i) вместо

Опять же имеет смысл если Ты ловишь исключения

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

Сплайн построить удалось, см. следующий ответ.

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

ошибка исправлена, след. этап - см. ниже

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

И еще вопрос: правильно ли я задаю массив knots для разомкнутого сплайна, если учесть, что сплайн не прямая, как здесь, а линия произвольной формы?

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

Удалось построить скругление на плоскости (см. код ниже). Может кто-нибудь подскажет, как построить скругление для пространственных сплайнов?

#ifdef WIN32

#define USE_MFC

#endif

#ifdef USE_MFC

#include <afxdlgs.h>

#include <afx.h>

#endif

#include <NXOpen/Session.hxx>

#include <NXOpen/Part.hxx>

#include <NXOpen/PartCollection.hxx>

#include <NXOpen/Point.hxx>

#include <NXOpen/PointCollection.hxx>

#include <NXOpen/Curve.hxx>

#include <NXOpen/Spline.hxx>

#include <NXOpen/Sketch.hxx>

#include <NXOpen/SketchCollection.hxx>

#include <NXOpen/NXObjectManager.hxx>

#include <NXOpen/Arc.hxx>

#include <NXOpen/CurveCollection.hxx>

#include <NXOpen/type.hxx>

#include <NXOpen/ugmath.hxx>

#include <Ug_spline.hxx>

#include <Vector3.hxx>

#include <uf_modl.h>

#include <uf_sket.h>

#include <string>

#include <fstream>

double rad=0.000021;

int i;

NXOpen::Session *theSession;

NXOpen::Part *workPart;

const UgObject* part_or_obj;

int N=5;

double delta;

std::vector <double> knots(9);

std::vector <Point4> points4(5);

std::vector <Point4> points4_1(5);

std::vector <Point4> points4_2(5);

int j;

UgSpline *spline,*spline1,*spline2;

NXOpen::Spline *s1,*s2,*s3;

NXOpen::Point *point1;

NXOpen::Point *point2;

NXOpen::Point *point3;

std::vector <NXOpen::SketchConstraint*> c;

char ch[20];

NXOpen::Sketch *s;

NXOpen::SketchCollection *sc;

double origin_point [ 3 ] ;

double plane_normal [ 3 ] ;

tag_t plane_tag ;

std::vector <NXOpen::Arc *> Fillet1;

NXOpen::Point3d p1;

NXOpen::Point3d p2;

NXOpen::Point3d p3;

NXOpen::Point3d p4;

NXOpen::Point *point4;

double matrix [ 9 ] ;

tag_t object [ 2 ],sketch_id ;

double apoint1 [ 3 ] ;

double apoint2 [ 3 ] ;

tag_t daxis_tag ;

int reference [ 2 ] ;

double point [ 3 ] ;

double direction [ 3 ];

tag_t dplane_tag ;

extern DllExport void ufusr( char *parm, int *returnCode, int rlen )

{

/* Initialize the API environment */

int errorCode = UF_initialize();

theSession= NXOpen::Session::GetSession();

workPart = theSession->Parts()->Work();

if ( workPart == NULL )

workPart = theSession->Parts()->NewDisplay("File2Points", NXOpen::Part::UnitsMillimeters);

p1.X=0; p1.Y=0.2; p1.Z=0;

p2.X=0.2; p2.Y=0; p2.Z=0;

p3.X=0.8; p3.Y=0.2; p3.Z=0;

p4.X=0; p4.Y=0; p4.Z=0;

direction[2]=1;

UF_MODL_create_fixed_dplane( point, direction,&dplane_tag );

matrix[0]=1;

matrix[4]=1;

object[0]=dplane_tag;

apoint2[0]=1;

UF_MODL_create_fixed_daxis( apoint1, apoint2,&daxis_tag );

object[1]=daxis_tag;

reference[0]=1; reference[1]=1;

strcpy_s(ch,"sc");

UF_SKET_initialize_sketch(ch,&sketch_id);

UF_SKET_create_sketch(ch,1, matrix, object, reference,2,&sketch_id );

sc=workPart->GetSketches();

sc->initialize();

s=(NXOpen::Sketch*)NXOpen::NXObjectManager::Get(sketch_id);

s->initialize();

part_or_obj=UgSession::getWorkPart();

delta = 1.0/((double)(N-4+1));

for(i = 0; i < 4; i++)

knots=0;

for(i = 4; i < N ; i++)

knots = (i-4+1)*delta;

for(i = N; i < N + 4; i++)

knots = 1;

for(i = 0; i < N ; i++)

points4 = Point4::Point4(0,i,0,1);

for(i = 0; i < N ; i++)

points4_1 = Point4::Point4(0.2*i,0,0,1);

for(i = 0; i < N ; i++)

points4_2 = Point4::Point4(0.8,i,0,1);

spline=UgSpline::create(4,knots,points4,part_or_obj);

spline1=UgSpline::create(4,knots,points4_1,part_or_obj);

spline2=UgSpline::create(4,knots,points4_2,part_or_obj);

s1 = (NXOpen::Spline*)NXOpen::NXObjectManager::Get(spline->getTag());

s2 = (NXOpen::Spline*)NXOpen::NXObjectManager::Get(spline1->getTag());

s3 = (NXOpen::Spline*)NXOpen::NXObjectManager::Get(spline2->getTag());

point1 = workPart->Points()->CreatePoint(p1);

point2 = workPart->Points()->CreatePoint(p2);

point3 = workPart->Points()->CreatePoint(p3);

Fillet1=s->Fillet(

s1,s3,s2,

p1,p3,p2,

rad,

NXOpen::Sketch::TrimInputOptionTrue,

NXOpen::Sketch::DeleteThirdCurveOptionTrue,

NXOpen::Sketch::CreateDimensionOptionTrue,

NXOpen::Sketch::AlternateSolutionOptionFalse,

c);

/* Terminate the API environment */

errorCode = UF_terminate();

}

/*****************************************************************************

** Utilities

*****************************************************************************/

/* Unload Handler

** This function specifies when to unload your application from Unigraphics.

** If your application registers a callback (from a MenuScript item or a

** User Defined Object for example), this function MUST return

** "UF_UNLOAD_UG_TERMINATE". */

extern int ufusr_ask_unload( void )

{

return(UF_UNLOAD_IMMEDIATELY);

}

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

Скругление пространственных 2 сплайнов и поверхности (если кривая имеет произвольную форму, а не окружность) можно реализовать с помощью кривой мостика. Но для этого надо задавать дополнительные исходные данные: точку касания на 2-х сплайнах. Строить кривую мостик, измерять расстояние до поверхности и методом итераций добиваться того, чтобы кривая мостик касалась поверхности с заданной точностью. Это можно реализовать либо на С, либо на С++.

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

Скругление пространственных 2 сплайнов и поверхности (если кривая имеет произвольную форму, а не окружность) можно реализовать с помощью кривой мостика. Но для этого надо задавать дополнительные исходные данные: точку касания на 2-х сплайнах. Строить кривую мостик, измерять расстояние до поверхности и методом итераций добиваться того, чтобы кривая мостик касалась поверхности с заданной точностью. Это можно реализовать либо на С, либо на С++.

Я предполагаю что это гиблая задача (если я ее правильно понял: кривая мостика идет по поверхности?)

Поясню

Тебе надо будет считать не расстояние между кривой мостика и поверхностью а девиацию между ей и поверхностью

То есть искать максимальное расстяние между каждой точкой множества принадлежащей кривой мостика и поверхностью

В силу того что точек множества кривой мостика много а свободных параметров у этой кривой мало

задачу Тебе решить будет трудно

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

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

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

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

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

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

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

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

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

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

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




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