Исходники, описания, примеры

Автор olden, 12.10.06, 07:35:42

« предыдущая - следующая »

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

msvteh

классная идея с большим окном предпросмотра, интересно в 14-ом компасе изменения в этом плане есть или все по старому?
только вот при открытии многолистового документа вижу в окне только первый лист, нельзя просматривать в окне растровые форматы, новый диалог не работает при вставке рисунка в чертеж.

snegok74

полностью готовая библиотека с сиходниками от yarikv
что умеет:
- создавать форму в библиотеке;
- в m3d a3d документах работает с полями 'обозначение' и 'наименование' в свойствах дерева детали;
- в kdw spw cdw документах работает с полями основной надписи 'обозначение' и 'наименование';
- плюс описание по использованию библиотеки;
- написана в Delphi.

Akew


Реализовал вращение компоненты посредством метода RotateComponent (как пример использования).

//-------------------------------------------------------------------------------
// Функция поворачивает первую компоненту открытой сборки на 70 градусов вокруг оси 0X.
// Фиксация компонент сборки должна быть отключена.
//
// "MyKompasObject" - это переименованный "kompas" (тип KompsasObject), например, в примере Step3d2 Visualc AUTO; определяется в функции void GetKompas().
// ---
void RotateComponent() {
CString title_dialog; title_dialog.Format( _T( "Функция %s" ), _T( "RotateComponent" ) ); // Заголовок окна сообщений функции
CString tmstr;

ksDocument3DPtr cur_doc = MyKompasObject->ActiveDocument3D();
if( cur_doc == NULL ) {
MessageBox(NULL, _bstr_t( _T("*** cur_doc == NULL. Выход.") ), title_dialog, MB_OK); return;
}

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

ksComponentPositionerPtr positioner = cur_doc->ComponentPositioner();
if( positioner == NULL ) {
MessageBox(NULL, _bstr_t( _T("*** positioner == NULL. Выход.") ), title_dialog, MB_OK); return;
}

if(!(positioner->SetAxisByPoints( 0,0,0,100,0,0 ))) { // Указание оси по двум точкам (ось 0X)
MessageBox(NULL, _T( "*** positioner->SetAxisByPoints() не отработал. Выход." ), title_dialog, MB_OK); return;
}

if( positioner->Prepare( part, pnRotate ) != 0 ) {
MessageBox(NULL, _T( "*** positioner->Prepare() не отработал. Выход." ), title_dialog, MB_OK); return;
}

if(!(positioner->RotateComponent( ( 3.1415926535897932384626433832795*(70.0/180.0) ) ))) { // Указание поворота на 70 градусов, перевод в радианы
MessageBox(NULL, _T( "*** positioner->RotateComponent() не отработал." ), title_dialog, MB_OK);
}

if(!(positioner->Finish())) {
MessageBox(NULL, _T( "*** positioner->Finish() не отработал. Выход." ), title_dialog, MB_OK);
return;
}

cur_doc->RebuildDocument(); // Перестроить сборку

return;
}


Желаю успехов!


snegok74

В дополнение к сообщению:
Выкладываю свой примерчик который .... http://forum.ascon.ru/index.php/topic,5841.msg157208.html#msg157208

добавлена кнопка отображениия листа без рамки. иногда очень полезно т.к. эскизы, в отличии от чертежей, не позволяют создавть виды -> масштабы.

Akew

Код реализует доступ к интерфейсу поверхности сети точек.

Он получает грани детали, открытой в Компасе, и создает для них поверхности IMeshPointsSurface.
Внимание!
У меня этот код В КОМПАСе версии 14 (sp1 и sp2) приводил к его вылету, на разных машинах. Предположительно, из-за наличия "косяка" в этих версиях. Это легко проверить, попытавшись вручную создать поверхность по сети точек для грани.
В версии 15 sp1 код работает нормально.

//-------------------------------------------------------------------------------
// Получить поверхности как сеть точек для всех граней открытого документа
// ---
void MakeMeshPointSurfaceAllFaces() {
CString title_dialog; title_dialog.Format( _T( "Функция %s" ), _T( "MakeMeshPointSurfaceAllFaces" ) );
CString tmpstr;

// 01. Получаем интерфейс открытого документа
ksDocument3DPtr opened_document_3d = MyKompasObject->ActiveDocument3D(); // MyKompasObject - то же самое, что и kompas в примерах (объект KompasObjectPtr)
if ( !opened_document_3d ) {
MessageBox(NULL, _bstr_t( _T("*** интерфейс opened_document_3d не получен. Выход.") ), title_dialog, MB_OK); return;
}

IKompasDocument3DPtr kompas_opened_document_3d( IUnknownPtr( ksTransferInterface( opened_document_3d, ksAPI7Dual, 0), false) );
if ( !kompas_opened_document_3d ) {
MessageBox(NULL, _bstr_t( _T("*** интерфейс kompas_opened_document_3d не получен. Выход.") ), title_dialog, MB_OK); return;
}

// 02. Получаем интерфейс корневой детали
ksPartPtr top_part_opened_doc = opened_document_3d->GetPart( pTop_Part );
if ( top_part_opened_doc == NULL ) {
MessageBox(NULL, _T("*** не удалось получить top_part_opened_doc. Выход." ), title_dialog, MB_OK); return;
}

ksBodyPtr ptr_body = top_part_opened_doc->GetMainBody(); // Объявление переменной типа "Указатель на интерфейс ksBody"
if ( ! ptr_body ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс ptr_body не получен. Выход." ) ), title_dialog, MB_OK); return;
}

// 03. Получаем коллекцию граней корневой детали
ksFaceCollectionPtr face_collection = ptr_body->FaceCollection();
if ( ! face_collection ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс face_collection не получен. Выход." ) ), title_dialog, MB_OK); return;
}

tmpstr.Format( _T("В модели %ld граней."), face_collection->GetCount() ); // Показать число граней в коллекции
MessageBox(NULL, tmpstr, title_dialog, MB_OK);

// 04. Получаем интерфейс коллекций поверхностей IMeshPointsSurfaces открытого документа
IPart7Ptr doc_part7 = kompas_opened_document_3d->TopPart;
if( doc_part7 == NULL ) {
MessageBox(NULL, _bstr_t( _T("*** doc_part7 == NULL. Выход.") ), title_dialog, MB_OK); return;
}

ISurfaceContainerPtr surface_container( doc_part7 );
if ( ! surface_container ) {
MessageBox(NULL, _bstr_t( _T( "*** surface_container не получен. Выход." ) ), title_dialog, MB_OK); return;
}

// 04. Получаем интерфейс коллекций поверхностей IMeshPointsSurfaces открытого документа
IMeshPointsSurfacesPtr mesh_points_surfaces( surface_container->MeshPointsSurfaces );
if ( ! mesh_points_surfaces ) {
MessageBox(NULL, _bstr_t( _T( "*** mesh_points_surfaces не получен. Выход." ) ), title_dialog, MB_OK); return;
}

for( long i=0; i<face_collection->GetCount(); ++i ) { // Проход по всем граням коллекции
// 05. Получаем грань из коллекции и переводим ее в тип IModelObject
ksFaceDefinitionPtr face_definition = face_collection->GetByIndex( i ); // Получить определитель i-й грани
if ( ! face_definition ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс face_definition не получен. Продолжение." ) ), title_dialog, MB_OK); continue;
}

ksSurfacePtr surface = face_definition->GetSurface();
if ( ! surface ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс surface не получен. Продолжение." ) ), title_dialog, MB_OK); continue;
}

IModelObjectPtr face_model_object( IUnknownPtr( ksTransferInterface( surface, ksAPI7Dual, 0), false) );
if ( ! face_model_object ) {
MessageBox(NULL, _bstr_t( _T( "*** face_model_object не получен. Продолжение." ) ), title_dialog, MB_OK); continue;
}

// 06. Создаем новую поверхность по сети точек
IMeshPointsSurfacePtr mesh_points_surface( mesh_points_surfaces->Add() );
if ( ! mesh_points_surface ) {
MessageBox(NULL, _bstr_t( _T( "*** mesh_points_surface не получен. Продолжение." ) ), title_dialog, MB_OK); continue;
}

// 07. Инициализируем поверхность по сети точек гранью face_model_object (получена на шаге 05)
if(!(mesh_points_surface->InitParamByFace( face_model_object ) ) ) {
MessageBox(NULL, _bstr_t( _T( "*** mesh_points_surface->InitParamByFace не отработал. Продолжение." ) ), title_dialog, MB_OK); continue;
}
mesh_points_surface->Update();
}

MessageBox(NULL, _bstr_t( _T("Поверхности граней документа получены.") ), title_dialog, MB_OK);

return;
}


Vitalij Lysanov

Табличное задание для параметров модели


В таблице три колонки 
Наименование
Значение
Управляющие (Построение и выход)

Исходная информация готовится в Excel и записывается на диск "С:\"  в формате с разделителем табуляция.
На новой детали включаем макрос, появляется таблица с исходными данными, можно изменить и на выполнение.

В первой колонке файла записано имя программы для которой предназначены данные.
Имя выполняемой программы также записано в переменную и можно выбрать из файла свои данные, типа базы данных для всех программ.


Из опыта применения в качестве аналога, кода записанного в графическом режиме.


При селектировании поверхностей нужна чистая точка без конфликтов и  легче работать с плоскостью на которой расположена поверхность, например для формирования эскиза.

В этом примере применена плоскость плоскость XY для построения эскизов.

   

     

Akew

Предлагаю Вашему вниманию фрагмент кода для программного выбора и удаления компонент из текущей сборки.
Комментарии - в коде:

//-------------------------------------------------------------------------------
// Выбрать компоненту для удаления, и удалить
//
// Фунцкия находит в текущей сборке вставленные компоненты, показывает их пользователю,
// и предлагает удалить одну из них по введенному порядковому номеру.
// ---
void ChooseComponent() {
CString title_dialog; title_dialog.Format( _T( "Функция %s" ), _T( "ChooseComponent" ) ); // Заголовок окна сообщений функции
CString tmpstr; // Строка для временных сообщений

ksDocument3DPtr document_3D = MyKompasObject->ActiveDocument3D(); // MyKompasObject - то же самое, что KompasObject в примерах
if ( !document_3D ) {
MessageBox(NULL, _bstr_t( _T("*** интерфейс document_3D не получен. Выход.") ), title_dialog, MB_OK); return;
}

IKompasDocument3DPtr doc3D( IUnknownPtr( ksTransferInterface( document_3D, ksAPI7Dual, 0), false) );
if ( !doc3D ) {
MessageBox(NULL, _bstr_t( _T("*** интерфейс doc3D не получен. Выход.") ), title_dialog, MB_OK); return;
}

IPart7Ptr topPart7 = doc3D->TopPart;
if ( !topPart7 ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс IPart7Ptr не получен. Выход." ) ), title_dialog, MB_OK); return;
}

// Выйти на вставленные компоненты
_variant_t uniqueParts( topPart7->PartsEx[ ( long )ksAllParts ] ); // Получить массив вставленных деталей и компонент на корневом уровне сборки
if ( ! ( uniqueParts.vt == ( VT_ARRAY | VT_DISPATCH ) ) ) return;

int count = uniqueParts.parray->rgsabound[0].cElements - uniqueParts.parray->rgsabound[0].lLbound;
if ( uniqueParts.parray->cDims != 1 ) return;

LPDISPATCH HUGEP *pvar;
HRESULT hr = ::SafeArrayAccessData( uniqueParts.parray, ( void HUGEP* FAR*)&pvar);
if ( ! ( !FAILED( hr ) && pvar ) ) return;

// Сосчитать компоненты и сформировать их список в строке
long count_components = 0; // кол-во компонент
for ( int i = 0; i < count; i++ ) {
IPart7Ptr obj( pvar[i] );
if ( !( obj ) ) continue;
if( obj->GetDetail() ) continue; // простые детали пропускаем

tmpstr.Format( _T("%ld "), i+1 );
components_str = components_str + tmpstr; // сохраняем название компоненты в строке
++count_components; // подсчитываем кол-во компонент
}

// Проверить, что компоненты в сборке есть
if( count_components == 0 ) {
tmpstr.Format( _T("В данной сборке нет ни одной компоненты. Выход.") );
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
return;
}

// Сохранить номера компонент в массиве
long *num_components = new long[ count_components ]; // создаем массив для сбора индексов компонент в сборке
long i_c = 0;
for ( int i = 0; i < count; i++ ) {
IPart7Ptr obj( pvar[i] );
if ( !( obj ) ) continue;
if( obj->GetDetail() ) continue;

num_components[ i_c++ ] = i;
}

// Собрать названия компонент в строке и показать ее
CString components_str = _T("В данной сборке есть следующие компоненты:\n\n"); // строка для списка компонент в сборке
for ( int i = 0; i < count_components; ++i ) {
IPart7Ptr obj( pvar[ num_components[ i ] ] );
if ( !( obj ) ) continue;
if( obj->GetDetail() ) continue;

tmpstr.Format( _T("%ld. Компонент %3ld: %s\n"), i+1, num_components[ i ], (LPWSTR)obj->GetName() ); // i+1 - для того чтобы отсчет велся с 1, а не с 0.
components_str = components_str + tmpstr;
}
tmpstr.Format( _T("         Всего: %ld\n\nВыберите компоненту, которую нужно удалить, и в следующем диалоге укажите ее номер (%ld...%ld)."), count_components, 1, count_components );
components_str = components_str + tmpstr;
MessageBox(NULL, components_str, title_dialog, MB_OK); // Выдача диалога со списком компонент

TCHAR bufPromptInsertNumber[255];
LPWSTR PromptInsertNumber; // Строка подсказки в диалоге ввода целого числа
_stprintf_s(bufPromptInsertNumber, _T("Введите номер компоненты (%ld...%ld), которая будет удалена:"), 1, count_components );
PromptInsertNumber = bufPromptInsertNumber;

long choosed_num; // Номер компоненты (порядковый), который будет удален
if( ! MyKompasObject->ksReadInt( PromptInsertNumber, 1, 1, count_components, &choosed_num )) { // Выдача диалога с запросом ввести целое число
tmpstr.Format( _T("*** отказ от ввода"), choosed_num );
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
return;
}

IPart7Ptr obj( pvar[ num_components[ choosed_num-1 ] ] ); // Получить IPart7 выбранной копоненты.
// choosed_num-1 - для того чтобы вернуть нумерацию с 0, а не с 1
tmpstr.Format( _T("Введено %ld.\nКомпонента\n%s\nбудет удалена."), choosed_num, (LPWSTR)obj->GetName() );
MessageBox(NULL, tmpstr, title_dialog, MB_OK);

// Подготовка к удалению. Получить интерфейс IFeature7 удаляемого IPart7
IFeature7Ptr part7_feature7( IUnknownPtr( ksTransferInterface( obj, ksAPI7Dual, 0 ), false) );

// Так тоже работает:
// const IFeature7Ptr part7_feature7;
// if ( obj->QueryInterface( IID_IFeature7, (void **)&part7_feature7 ) != S_OK || !part7_feature7 ) {
// tmpstr.Format( _T("*** obj->QueryInterface( . . . ) не отработал. Выход") );
// MessageBox(NULL, tmpstr, title_dialog, MB_OK);
// return;
// }

if( part7_feature7 == NULL ) {
tmpstr.Format( _T("*** не удалось получить part7_feature7. Выход") );
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
return;
}

if( ! part7_feature7->Delete()  ) {
tmpstr.Format( _T("*** не удалось удалить компоненту № %ld. Выход"),
num_components[ choosed_num-1 ] // choosed_num-1 - для того чтобы вернуть нумерацию с 0, а не с 1
);
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
}
MessageBox(NULL, _T("Гип-гип ура, компонента успешно удалена."), title_dialog, MB_OK);

return;
}


Успехов!