Как преобразовать интерфейс элемента массива в точечный объект?

Автор Akew, 10.10.17, 17:55:32

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

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

Akew

Здравствуйте!
Нужно создать точку, "привязанную" к одному из экземпляров циркулярного массива (например, к 7-му).
Массив также состоит из точек.
Как я понимаю, нужно IModelObject элемента массива преобразовать к точечному объекту (ksVertex), и затем преобразовать его в IModelObject, чтобы указать как объект ассоциации для создаваемой точки. Никак не удается выполнить первое преобразование (элемент массива к точечному объекту).
Подскажите, пожалуйста, как это сделать.
Спасибо!
Код прилагаю.
void CreatePoint3DonArrayElement() {
CString titleDialog = _T( "Функция ShowInfoAbout3DLineSegment" );
CString tmpstr;

IKompasDocumentPtr doc( MyApplication->ActiveDocument );
if ( !doc ) {
MessageBox(NULL, _T("Интерфейс associationObjectOfStartPointAsMO не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

IKompasDocument3DPtr document3D( doc );
if ( !document3D ) {
MessageBox(NULL, _T("Интерфейс document3D не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

IPart7Ptr part7( document3D->GetTopPart() );
if ( !part7 ) {
MessageBox(NULL, _T("Интерфейс part7 не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

IModelContainerPtr modelContainer( part7 );
if (!modelContainer) {
MessageBox(NULL, _T("Интерфейс modelContainer не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

IFeaturePatternsPtr patternsCol( modelContainer->FeaturePatterns );
if ( !patternsCol ) {
MessageBox(NULL, _T("Интерфейс patternsCol не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}
ICircularPatternPtr newPattern( patternsCol->Add( o3d_AuxCircularCopy ) );
if ( !newPattern ) {
MessageBox(NULL, _T("Интерфейс newPattern не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}


// Построить точку для циркулярного массива
IPoints3DPtr points3D( modelContainer->Points3D );
if ( !points3D ) {
MessageBox(NULL, _T("Интерфейс points3D не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

IPoint3DPtr point3D( points3D->Add() );
if ( !point3D ) {
MessageBox(NULL, _T("Интерфейс point3D не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}
point3D->X = 100.0;
point3D->Y = 0.0;
point3D->Z = 0.0;
point3D->Symbol = ksStrikeSquarePoint;
point3D->Update();

// Преобразовать point3D в IModelObject
IModelObjectPtr point3DAsModelObject( IUnknownPtr( ksTransferInterface( point3D, ksAPI7Dual, 0), false ) );
if ( !point3DAsModelObject ) {
MessageBox(NULL, _T("Интерфейс point3DAsModelObject не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

// Задать параметры циркулярного массива
newPattern->PutBuildingType( ksCPSaveAll );

IDispatchPtr initialObjectAsIDispatch( point3DAsModelObject );
if( !initialObjectAsIDispatch ) {
MessageBox( NULL, _T( "Интерфейс initialObjectAsIDispatch не получен. Выход" ), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

_variant_t initialObjectAsVariant;
VariantInit( &initialObjectAsVariant );
V_VT(&initialObjectAsVariant) = VT_DISPATCH;
initialObjectAsVariant.punkVal = initialObjectAsIDispatch;

newPattern->PutInitialObjects( initialObjectAsVariant );

// Шаг копирования в кольцевом направлении
newPattern->Step2 = 360;
// Количество экземпляров в кольцевом направлении
newPattern->Count1 = 1;
newPattern->PutCount2( 10 );
// Шаг между крайними экземплярами
newPattern->BoundaryInstancesStepFactor2 = TRUE;

// Ось массива
IModelObjectPtr axisOZ( part7->GetDefaultObject(o3d_axisOZ) );
if ( !axisOZ ) {
MessageBox(NULL, _T("Интерфейс axisOZ не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

newPattern->PutAxis( axisOZ );
newPattern->Update();

// Создать точку, привязанную к 7-му элементу циркулярного массива
IModelObjectPtr sevenElementAsModelObject( newPattern->GetExemplar( 1, 7 ) );
if ( !sevenElementAsModelObject ) {
MessageBox(NULL, _T("Интерфейс sevenElementAsModelObject не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

IPoint3DPtr point3DonSevenElement( points3D->Add() );
if ( !point3DonSevenElement ) {
MessageBox(NULL, _T("Интерфейс point3DonSevenElement не получен. Выход"), titleDialog, MB_OK|MB_ICONWARNING );
return;
}

point3DonSevenElement->PutParameterType( ksPParamCoord );

point3DonSevenElement->PutSymbol( ksCirclePoint );
point3DonSevenElement->PutName( _bstr_t( _T("Точка на 7-м экземпляре") ) );
point3DonSevenElement->SetAssociationObject( sevenElementAsModelObject );

if( !point3DonSevenElement->AssociationObject ) {
MessageBox(NULL, _T("point3DonSevenElement->AssociationObject не удалось установить"), titleDialog, MB_OK|MB_ICONWARNING );
}

point3DonSevenElement->Update();

return;
}


Akew

Разобрался самостоятельно.
Это было ошибкой, переводить экземпляр массива в точечный объект. Хотя бы потому, что в общем случае экземпляром циркулярного массива может быть любой объект, не обязательно точечный (отрезок, тело и т.д.). Поэтому, в моем случае, вначале нужно получить элементы, содержащиеся в экземпляре, и найти среди них точечный - с ним и работать.
Итак, вначале IModelObject экземпляра нужно преобразовать в ksFeature, затем получить массив методом SubFeatureCollection. В этой коллекции - найти точечный объект (в моем случае это единственный элемент).