• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Построение "кривой по закону" через api в Delphi

Автор Pavelllllllll, 13.06.16, 19:10:28

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Pavelllllllll

Всем привет, вот уже неделю не могу разобраться с этим вопросом, все перепробовал, мозг взрывается а результата нет!
В общем нужно построить "кривую по закону" из делфи, все что смог вот:

var
isCurveByLaws :ICurveByLaws;
isCurveByLaw:iCurveByLaw;
CurveksEntity:ksEntity;
Part: ksPart;
...
begin
//подключение к Компас
...

Part:= ksPart(Document3D.GetPart(pTop_Part));
CurveksEntity := ksEntity(Part.NewEntity(o3d_CurveByLaw));
if (CurveksEntity <> nil) then
begin
isCurveByLaw := iCurveByLaw(CurveksEntity.GetDefinition);
if (isCurveByLaw <> nil) then
begin

// задаем параметры
isCurveByLaw.PointsType := ldefin3d.ksPParamCoord;
isCurveByLaw.Set_LawType(ldefin3d.ksCLawX, ldefin3d.ksTLawByExpression) ;
isCurveByLaw.Set_LawType(ldefin3d.ksCLawY, ldefin3d.ksTLawByExpression)  ;
isCurveByLaw.Set_LawType(ldefin3d.ksCLawZ, ldefin3d.ksTLawByExpression) ;
isCurveByLaw.Set_TMin(ldefin3d.ksCLawX, 0.00000000000)                ;
isCurveByLaw.Set_TMin(ldefin3d.ksCLawY, 0.00000000000)       ;
isCurveByLaw.Set_TMin(ldefin3d.ksCLawZ, 0.00000000000)       ;
isCurveByLaw.Set_TMax(ldefin3d.ksCLawX, 180.00000000000)       ;
isCurveByLaw.Set_TMax(ldefin3d.ksCLawY, 180.00000000000)        ;
isCurveByLaw.Set_TMax(ldefin3d.ksCLawZ, 180.00000000000)       ;
isCurveByLaw.Set_Expression(ldefin3d.ksCLawX, '(70)*cos((M_PI/90)*t)-M_E*cos((70)*(M_PI/90*t)/10)')       ;
isCurveByLaw.Set_Expression(ldefin3d.ksCLawY, '(70)*sin((M_PI/90)*t)-M_E*sin((70)*(M_PI/90*t)/10)')      ;
isCurveByLaw.Set_Expression(ldefin3d.ksCLawZ, '0')     ;
isCurveByLaw.Update()                                            ;
...



Подключается, создает деталь и вываливается в параметрах :(
Я понимаю что чего-то не хватает, но чего?
Буду благодарен любой помощи.

Получить IAuxiliaryGeomContainer - интерфейс контейнера объектов вспомогательной геометрии, от него ICurveByLaws - интерфейс коллекции кривых по закону и собственно кривую по закону ICurveByLaw.
+ Благодарностей: 1

Pavelllllllll

Можно поподробнее, как его получить?
Я задал переменную типа "IAuxiliaryGeomContainer", попытался получить из него ICurveByLaws, и получил ошибку. Может я что-то не так делаю?

Curves:= Container.get_CurveByLaws;

Golovanev

function NewCurveByLaw(_iKApp: IApplication): ICurveByLaw;
var
  lIDoc3D: IKompasDocument3D;
  lIPart: IPart7;
  lIAuxGeomContainer: IAuxiliaryGeomContainer;
  lICurveByLaws : ICurveByLaws;
begin
  Result := nil;

  if _iKApp = nil then
    Exit;

  lIDoc3D := _iKApp.ActiveDocument as IKompasDocument3D;
  if lIDoc3D = nil then
    exit;
  lIPart := lIDoc3D.TopPart;
  if lIPart = nil then
    exit;

lIAuxGeomContainer := lIPart as IAuxiliaryGeomContainer;
if lIAuxGeomContainer = nil then
    Exit;

lICurveByLaws := lIAuxGeomContainer.CurvesByLaws;
if lICurveByLaws = nil then
    Exit;

Result := lICurveByLaws.Add;


end;
+ Благодарностей: 1

Задать мало, её нужно получить.
Код с учётом, что документ создан и активен.
var
Disp:IDispatch;
KompasAPI:IApplication;
pDocument:IKompasDocument;
Doc3D:IKompasDocument3D;
pPart7:IPart7;
pAuxiliaryGeomContainer:IAuxiliaryGeomContainer;
pCurveByLaws:ICurveByLaws;
pCurveByLaw:ICurveByLaw;
...
Disp:=IDispatch(CreateKompasApplication);
if Disp<>nil then KompasAPI:=Disp as IApplication;
if KompasAPI<>nil then pDocument:=KompasAPI.ActiveDocument;
if pDocument<>nil then if pDocument.DocumentType=ksDocumentPart then Doc3D:=pDocument as IKompasDocument3D;
if Doc3D<>nil then pPart7:=Doc3D.TopPart;
if pPart7<>nil then pAuxiliaryGeomContainer:=pPart7 as IAuxiliaryGeomContainer;
if pAuxiliaryGeomContainer<>nil then pCurveByLaws:=pAuxiliaryGeomContainer.CurveByLaws;
if pCurveByLaws<>nil then pCurveByLaw:=pCurveByLaws.Add;
...
+ Благодарностей: 1

Pavelllllllll


Pavelllllllll

И еще такой вопрос, как ее теперь выбрать для выдавливания?

Вы код показывайте, что не получается?

c:\Program Files\ASCON\KOMPAS-3D V16\SDK\Pascal\Delphi\Step4_API7_3D\Step4_API7_3D_1.pas

Pavelllllllll

15.06.16, 10:43:15 #8 Последнее редактирование: 15.06.16, 14:26:50 от Pavelllllllll
Создал кривую по закону
  Doc3D := KP.ActiveDocument as IKompasDocument3D;
  Part777 := Doc3D.TopPart;
Container := Part777 as IAuxiliaryGeomContainer;
Curves := Container.CurveByLaws;
cur :=Curves.Add;
...
//параметры
...
Cur.Update();


Теперь ее нужно выдавить, нашел через SelectByPoint и вроде бы все, но вот направляющий объект не знаю как выбрать
iPart:= ksPart(Doc3.GetPart(pTop_Part));
EntityDraw:=ksEntity(iPart.NewEntity(o3d_sketch));
iCollection := ksEntityCollection(iPart.EntityCollection(o3d_edge));
iCollection.SelectByPoint((70)*cos(pi/2)-2.7*cos(3*(PI/2)),(70)*sin(pi/2)-2.7*sin(3*(pi/2)),0);
iEdge := ksEntity(iCollection.last());
iEdgeDefinition := ksEdgeDefinition(iEdge.GetDefinition());
iSketch:= ksEntity(iEdgeDefinition.GetOwnerEntity());
EntityExtrusion:=ksEntity(iPart.NewEntity(o3d_BossExtrusion));
BossExtrusionDefinition := ksBossExtrusionDefinition(EntityExtrusion.GetDefinition());
BossExtrusionDefinition.SetSideParam(TRUE,etBlind,20,0,TRUE);
BossExtrusionDefinition.setSketch(iSketch);
EntityExtrusion.Create;

Полный бред, выше есть путь к примеру, найдёте в примере функцию CreateExtrusion и посмотрите, как делается.

Pavelllllllll

В примере выдавливание строится по эскизу, у меня эскиза нет, есть пространственная кривая. Я пытался создать эскиз и спроецировать на него кривую, но, почему-то, макрос не записывает проекцию кривой на эскиз. В итоге я выбрал кривую и запихал ее в BossExtrusionDefinition.setSketch(iSketch) вместо эскиза. Оно сработало, но не совсем верно, так как направляющая для выдавливания не выбрана.


var
iCollection:ksEntityCollection;
iEdgeDefinition:ksEdgeDefinition;
iEdge,iSketch:ksEntity;
...
iPart:= ksPart(Doc3.GetPart(pTop_Part));
EntityDraw:=ksEntity(iPart.NewEntity(o3d_sketch));
iCollection := ksEntityCollection(iPart.EntityCollection(o3d_edge));
iCollection.SelectByPoint((70)*cos(pi/2)-2.7*cos(3*(PI/2)),(70)*sin(pi/2)-2.7*sin(3*(pi/2)),0);
iEdge := ksEntity(iCollection.last());
iEdgeDefinition := ksEdgeDefinition(iEdge.GetDefinition());
iSketch:= ksEntity(iEdgeDefinition.GetOwnerEntity());
EntityExtrusion:=ksEntity(iPart.NewEntity(o3d_BossExtrusion));
BossExtrusionDefinition := ksBossExtrusionDefinition(EntityExtrusion.GetDefinition());
BossExtrusionDefinition.SetSideParam(TRUE,etBlind,20,0,TRUE);
BossExtrusionDefinition.setSketch(iSketch);
EntityExtrusion.Create;

Эскиз у Вас пустой, Вы картинку прикрепите, что получилось и, что надо получить.

Pavelllllllll

1.Кривая по закону;
2.Попытка выдавить;
3.Нет направляющей;
4.Должно быть так.

Создайте проекцию кривой в эскизе AddProjectionOf.
+ Благодарностей: 1

Pavelllllllll


Akew

Pavelllllllll, если у Вас поучилось создать проекцию, то, поделитесь, пожалуйста, кодом.

Мне понравилась Ваша задача, и я реализовал ее в Visual Studio. Получилось все, кроме создания проекции кривой по закону на эскиз. А именно, не понятно, к какому типу ее нужно преобразовать, когда применяется AddProjectionOf().
Пока операция выдавливания создается, но с ошибкой в дереве построения, - пустой эскиз (т.е., проекция в нем не создается). Когда делаю проекцию вручную - тело создается, как надо, и эта ошибка исчезает.

Если кто знает, в чем загвоздка, - буду признателен за подсказку.

Прилагаю фрагмент своего кода.
void WorkWithCurveByLaw() {
CString title_dialog = _T("Функция WorkWithCurveByLaw");
CString tmpstr;

. . . // Инициализация IDocument3D document_3D, IPart7 part7

IAuxiliaryGeomContainerPtr auxiliaryGeomContainer = part7;
if( auxiliaryGeomContainer == NULL ) {
tmpstr.Format(_T("Не удалось получить IAuxiliaryGeomContainer. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

ICurveByLawsPtr curveByLaws = auxiliaryGeomContainer->CurveByLaws;
if( curveByLaws == NULL ) {
tmpstr.Format(_T("Не удалось получить ICurveByLaws. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

ICurveByLawPtr curveByLaw = curveByLaws->Add();
if( curveByLaw == NULL ) {
tmpstr.Format(_T("Не удалось получить ICurveByLaw. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

curveByLaw->PointsType = ksPParamCoord;
curveByLaw->PutLawType(ksCLawX, ksTLawByExpression);
curveByLaw->PutLawType(ksCLawY, ksTLawByExpression);
curveByLaw->PutLawType(ksCLawZ, ksTLawByExpression);
curveByLaw->PutTMin(ksCLawX, 0.00000000000);
curveByLaw->PutTMin(ksCLawY, 0.00000000000);
curveByLaw->PutTMin(ksCLawZ, 0.00000000000);
curveByLaw->PutTMax(ksCLawX, 180.00000000000);
curveByLaw->PutTMax(ksCLawY, 180.00000000000);
curveByLaw->PutTMax(ksCLawZ, 180.00000000000);
curveByLaw->PutExpression(ksCLawX, "(70)*cos((M_PI/90)*t)-M_E*cos((70)*(M_PI/90*t)/10)");
curveByLaw->PutExpression(ksCLawY, "(70)*sin((M_PI/90)*t)-M_E*sin((70)*(M_PI/90*t)/10)");
curveByLaw->PutExpression(ksCLawZ, "0");
curveByLaw->Update();

tmpstr.Format(_T("Кривая по закону построена") );
MessageBox(NULL, tmpstr, title_dialog, MB_OK|MB_ICONINFORMATION );

// Создать операцию выдавливания по кривой по закону
ksPartPtr topPart = document_3D->GetPart( pTop_Part );
if(!topPart) {
MessageBox(NULL, _T("Не удалось получить ksPartPtr topPart. Выход"), title_dialog, MB_OK|MB_ICONERROR ); return;
}

topPart->BeginEdit();

// Эскиз
ksEntityPtr entityForCurveByLaw = topPart->NewEntity(o3d_sketch);
if( entityForCurveByLaw == NULL ) {
tmpstr.Format(_T("Не удалось получить ksEntity. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

ksSketchDefinitionPtr sketchDefinition = entityForCurveByLaw->GetDefinition();
if( sketchDefinition == NULL ) {
tmpstr.Format(_T("Не удалось получить ksSketchDefinitionPtr sketchDefinition. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Получим интерфейс базовой плоскости XOY
ksEntityPtr basePlane1 = topPart->GetDefaultEntity( o3d_planeXOY );
if( basePlane1 == NULL ) {
tmpstr.Format(_T("Не удалось получить ksEntityPtr basePlane1. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Установка параметров эскиза
sketchDefinition->SetPlane( basePlane1 ); // Установим плоскость XOY базовой для эскиза

// Создадим эскиз
entityForCurveByLaw->Create();

// Войти в режим редактирования эскиза
if ( sketchDefinition->BeginEdit() ) {

// Преобразовать кривую по закону к IModelObject
IModelObjectPtr curveByLawAsModelObject( curveByLaw );
if( curveByLawAsModelObject == NULL ) {
tmpstr.Format(_T("Не удалось получить IModelObjectPtr curveByLawAsModelObject. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Преобразовать кривую по закону из IModelObject к ksEntity
ksEntityPtr curveByLawAsEntity = IUnknownPtr(ksTransferInterface( curveByLawAsModelObject, ksAPI5Auto, 0), false );
if( curveByLawAsEntity == NULL ) {
tmpstr.Format(_T("Не удалось получить ksEntityPtr curveByLawAsEntity. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
// return; // Преобразование не удается
}

// Преобразовать кривую по закону к IDispatch
IDispatchPtr curveByLawAsIDispatch = IUnknownPtr(ksTransferInterface( curveByLawAsModelObject, ksAPI7Dual, 0), false );
if( curveByLawAsIDispatch == NULL ) {
tmpstr.Format(_T("Не удалось получить IDispatchPtr curveByLawAsIDispatch. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Получить проекцию кривой по закону на эскиз, используя ее разные представления
// long nn = sketchDefinition->AddProjectionOf( curveByLawAsEntity );
// long nn = sketchDefinition->AddProjectionOf( curveByLawAsModelObject );
long nn = sketchDefinition->AddProjectionOf( curveByLawAsIDispatch );
tmpstr.Format(_T("nn = %ld"), nn );
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONINFORMATION );

// Выйти из режима редактирования эскиза
sketchDefinition->EndEdit();
}

// Оперция выдавливания
ksEntityPtr entityExtrusion = topPart->NewEntity( o3d_baseExtrusion );
if ( entityExtrusion ) {
// Интерфейс базовой операции выдавливания
ksBaseExtrusionDefinitionPtr extrusionDefinition = IUnknownPtr( entityExtrusion->GetDefinition() );
if ( extrusionDefinition ) {
extrusionDefinition->PutdirectionType( dtNormal );     // Направление выдавливания ( dtNormal - прямое
extrusionDefinition->SetSideParam( true,               // Направление выдавливания ( TRUE - прямое направление,
etBlind,            // Тип выдавливания ( etBlind - строго на глубину,
20,                 // Глубина выдавливания
0,                  // Угол уклона
false               // Направление уклона ( TRUE - уклон наружу, FALSE - уклон внутрь )
);
extrusionDefinition->SetSketch( entityForCurveByLaw );        // Эскиз операции выдавливания

entityExtrusion->Create();  // Создать операцию выдавливания
}
}

topPart->EndEdit(1);
topPart->Putname(_bstr_t( _T("Деталь, полученная по кривой по закону")));
topPart->Update();

tmpstr.Format(_T("Работа с кривой по закону закончена") );
MessageBox(NULL, tmpstr, title_dialog, MB_OK|MB_ICONINFORMATION );

return;
}


P.S.
Ответ приводите на любом языке, - не обязательно на C++ (на Делфи пойдет).

Спасибо!

Pavelllllllll

Doc2:=ksDocument2D(SketchDefinition.BeginEdit());
iCollection := ksEntityCollection(iPart.EntityCollection(o3d_edge));
x:= (70)*cos((PI/4)-e*cos((70)*(PI/4)/10);
y:= (70)*sin((PI/4)-e*sin((70)*(PI/4)/10);
iCollection.SelectByPoint(x,y,0);
iEdge := ksEntity(iCollection.last());
iEdgeDefinition := ksEdgeDefinition(iEdge.GetDefinition());
iSketch:= ksEntity(iEdgeDefinition.GetOwnerEntity());
SketchDefinition.AddProjectionOf(iSketch);
SketchDefinition.EndEdit();
+ Благодарностей: 1

Akew

Pavelllllllll, спасибо за идею.

Функциональность Вашего кода останется прежней, если его "подсушить" (на Делфи не проверял, однако, на Visual C++ данный подход сработал нормально):
Doc2:=ksDocument2D(SketchDefinition.BeginEdit()); (* Начать редактирование эскиза *)
iCollection := ksEntityCollection(iPart.EntityCollection(o3d_CurveByLaw)); (* Получить коллекцию кривых по закону, o3d_CurveByLaw (а не просто ребер, o3d_edge, как было раньше) *)
iEdge := ksEntity(iCollection.last()); (* Получить кривую по закону, созданную последней (т.е., только что), в формате ksEntity *)
SketchDefinition.AddProjectionOf(iEdge); (* Спроецировать кривую *)
SketchDefinition.EndEdit(); (* Завершить редактирование эскиза *)

Я смог получить способ получения ksEntity создаваемой кривой непосредственно при ее конструировании (о чем и спрашивал вчера).
Для этого не требуется залезать в контейнер (IAuxiliaryGeomContainer), разыскивать там нужную кривую и получать для нее ksEntity, необходимый для проецирования. (Задумайтесь на минутку, как вы искали бы нужную кривую, если бы их там было несколько, а не одна-единственная.)

У меня создание кривой идет другим путем:
1. От topPart создается новый ksEntity типа o3d_CurveByLaw ( NewEntity(o3d_CurveByLaw) ).
2. От него получается LPDISPATCH ( GetDefinition() ), преобразуемый к типу ICurveByLaw.
3. У последнего заполняются свойства кривой по закону (как в исходном варианте).
4. Update() для ICurveByLaw, Create() - для ksEntity.

Далее, когда нужно проецировать созданную кривую, берется готовый ksEntity этой кривой.

Удобство моего способа состоит в том, что, если в программе мы создадим несколько кривых по закону, а решение о выборе какой-то одной из них для эскиза принимается позже (по тем или иным условиям), у нас всегда будет доступ к готовым ksEntity каждой из этих кривых, а не к "свалке" их в коллекции, из которой раньше просто брался последний элемент.

Код прилагаю:
//-------------------------------------------------------------------------------
// Работа с Кривой По Закону
// ---
void WorkWithCurveByLaw() {
CString title_dialog = _T("Функция WorkWithCurveByLaw");
CString tmpstr;

ksDocument3DPtr current_doc = kompas->ActiveDocument3D();
if( current_doc == NULL ) {
MessageBox(NULL, _bstr_t( _T("Не удалось получить ksDocument3DPtr current_doc. Выход") ), title_dialog, MB_OK|MB_ICONERROR); return;
}

ksPartPtr topPart = current_doc->GetPart( pTop_Part );
if ( topPart == NULL ) {
MessageBox(NULL, _T("*** не удалось получить topPart. Выход" ), title_dialog, MB_OK|MB_ICONERROR); return;
}

// Получить ksEntity кривой по закону
ksEntityPtr curveByLawAsEntity;
curveByLawAsEntity = topPart->NewEntity( o3d_CurveByLaw );
if( curveByLawAsEntity == NULL ) {
tmpstr.Format(_T("Не удалось получить curveByLawAsEntity. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK|MB_ICONERROR);
return;
}

LPDISPATCH curveByLawAsLPDISPATCH = curveByLawAsEntity->GetDefinition();
if( curveByLawAsLPDISPATCH == NULL ) {
tmpstr.Format(_T("Не удалось получить curveByLawAsLPDISPATCH. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

ICurveByLawPtr curveByLaw( IUnknownPtr( ksTransferInterface( curveByLawAsLPDISPATCH, ksAPI7Dual, 0), false ) );
if( curveByLaw == NULL ) {
tmpstr.Format(_T("Не удалось получить curveByLaw. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}
curveByLaw->PointsType = ksPParamCoord;
curveByLaw->PutLawType(ksCLawX, ksTLawByExpression);
curveByLaw->PutLawType(ksCLawY, ksTLawByExpression);
curveByLaw->PutLawType(ksCLawZ, ksTLawByExpression);
curveByLaw->PutTMin(ksCLawX, 0.0);
curveByLaw->PutTMin(ksCLawY, 0.0);
curveByLaw->PutTMin(ksCLawZ, 0.0);
curveByLaw->PutTMax(ksCLawX, 180.0);
curveByLaw->PutTMax(ksCLawY, 180.0);
curveByLaw->PutTMax(ksCLawZ, 180.0);
curveByLaw->PutExpression(ksCLawX, "70.0*cos((M_PI/90.0)*t) - M_E*cos(70.0*(M_PI/90.0*t)/10.0)");
curveByLaw->PutExpression(ksCLawY, "70.0*sin((M_PI/90.0)*t) - M_E*sin(70.0*(M_PI/90.0*t)/10.0)");
curveByLaw->PutExpression(ksCLawZ, "0.0");
curveByLaw->Update();

curveByLawAsEntity->Create();

// Создать операцию выдавливания по кривой по закону
topPart->BeginEdit();

// Эскиз
ksEntityPtr scetchWithCurveByLawAsEntity = topPart->NewEntity(o3d_sketch);
if( scetchWithCurveByLawAsEntity == NULL ) {
tmpstr.Format(_T("Не удалось получить ksEntityPtr scetchWithCurveByLawAsEntity. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

ksSketchDefinitionPtr sketchDefinition = scetchWithCurveByLawAsEntity->GetDefinition();
if( sketchDefinition == NULL ) {
tmpstr.Format(_T("Не удалось получить ksSketchDefinitionPtr sketchDefinition. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Получим интерфейс базовой плоскости XOY
ksEntityPtr basePlane = topPart->GetDefaultEntity( o3d_planeXOY );
if( basePlane == NULL ) {
tmpstr.Format(_T("Не удалось получить ksEntityPtr basePlane. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Установка параметров эскиза
sketchDefinition->SetPlane( basePlane ); // Установим плоскость XOY базовой для эскиза

// Создадим эскиз
scetchWithCurveByLawAsEntity->Create();

// Войти в режим редактирования эскиза
ksDocument2DPtr scetchAsDocument2D = sketchDefinition->BeginEdit();
if( scetchAsDocument2D == NULL ) {
tmpstr.Format(_T("Не удалось получить ksDocument2DPtr scetchAsDocument2D. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Спроецировать кривую на эскиз
long nn = sketchDefinition->AddProjectionOf( curveByLawAsEntity );
if(nn==0) {
tmpstr.Format(_T("Похоже, спроецировать кривую по закону не удалось") );
MessageBox( NULL, tmpstr, title_dialog, MB_OK|MB_ICONWARNING );
}

// Выйти из режима редактирования эскиза
sketchDefinition->EndEdit();

// Оперция выдавливания
ksEntityPtr entityExtrusion = topPart->NewEntity( o3d_baseExtrusion );
if( entityExtrusion == NULL ) {
tmpstr.Format(_T("Не удалось получить ksEntityPtr entityExtrusion. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Интерфейс базовой операции выдавливания
ksBaseExtrusionDefinitionPtr extrusionDefinition = IUnknownPtr( entityExtrusion->GetDefinition() );
if( extrusionDefinition == NULL ) {
tmpstr.Format(_T("Не удалось получить ksBaseExtrusionDefinitionPtr extrusionDefinition. Выход"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return;
}

// Установка параметров операции выдавливания
extrusionDefinition->PutdirectionType( dtNormal );
extrusionDefinition->SetSideParam( true, etBlind, 20.0, 0.0, false );
extrusionDefinition->SetThinParam( true, dtBoth, 10.0, 10.0 );
extrusionDefinition->SetSketch( scetchWithCurveByLawAsEntity );

entityExtrusion->Create(); 

topPart->EndEdit(VARIANT_TRUE);
topPart->Putname(_bstr_t( _T("Деталь, полученная по кривой по закону")));
topPart->Update();

tmpstr.Format(_T("Работа с кривой по закону закончена") );
MessageBox(NULL, tmpstr, title_dialog, MB_OK|MB_ICONINFORMATION );

return;
}