Режим фильтрации

Автор Lemieux, 24.08.24, 09:25:28

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

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

Lemieux

Цитата: Starik от 28.08.24, 08:28:22Вот не знаю, что это слово обозначает. Но если оно ругательное то..............

scale_1200.jpg
Кант любил заниматься метафизикой. Я думаю, кто читал Канта, а потом Ницше, поймут.

Vi2

Цитата: Lemieux от 28.08.24, 08:15:53Подсвечиваются под курсором или выделаются после нажатия ЛКМ?

Когда курсор движется по экрану, то подсвечиваются только те элементы, для которого функция фильтрации возвращает Да. Если кликнуть ЛКМ, то элемент выделяется уже селектором, которому, возможно, даются плюс совершенно другие элементы, например, гладкие сопряжения с кликнутой гранью.

Есть режим Грани и/или Рёбра, если выбирается режим Грани, то рёбра не подсвечиваются при проходе над ними, если выбирается режим Рёбер, то грани не подсвечиваются.

Никаких действий с Фильтром Компаса не делается, но он влияет. По-видимому, фильтр Компаса работает раньше до вызова функции фильтрации процесса. Т.е. если отключить рёбра в фильтре Компаса, то и программа перестаёт подсвечивать ребра.

Цитата: Lemieux от 28.08.24, 08:15:53Вот, что я хочу получить
Короче, форум не поддерживает гифки, как обычно от АСКОН. Не покажу Вам. Просто наставьте внутри любой большой сборки точек и попробуйте их выделить, у Вас не получится. Но если включить "Фильтровать точки", то ничего, кроме точек под курсором не будет подсвечиваться.

Я не совсем знаю Компас и не использовал UserSelectEntity, т.к. используем UserGetPlacementAndEntity. Если на ГИФке работает Ваша программа, то всё же ОК, нет?

Михаил88

Цитата: Lemieux от 28.08.24, 08:15:53Просто наставьте внутри любой большой сборки точек и попробуйте их выделить, у Вас не получится.

Если включить режим каркас то получится.
+ Благодарностей: 1

Lemieux

Цитата: Vi2 от 28.08.24, 11:09:13Я не совсем знаю Компас и не использовал UserSelectEntity, т.к. используем UserGetPlacementAndEntity. Если на ГИФке работает Ваша программа, то всё же ОК, нет?
Это пример включенной кнопки "Фильтровать точки".

Lemieux

Цитата: Vi2 от 28.08.24, 11:09:13Когда курсор движется по экрану, то подсвечиваются только те элементы, для которого функция фильтрации возвращает Да. Если кликнуть ЛКМ, то элемент выделяется уже селектором, которому, возможно, даются плюс совершенно другие элементы, например, гладкие сопряжения с кликнутой гранью.

Есть режим Грани и/или Рёбра, если выбирается режим Грани, то рёбра не подсвечиваются при проходе над ними, если выбирается режим Рёбер, то грани не подсвечиваются.

Никаких действий с Фильтром Компаса не делается, но он влияет. По-видимому, фильтр Компаса работает раньше до вызова функции фильтрации процесса. Т.е. если отключить рёбра в фильтре Компаса, то и программа перестаёт подсвечивать ребра.

Я не совсем знаю Компас и не использовал UserSelectEntity, т.к. используем UserGetPlacementAndEntity. Если на ГИФке работает Ваша программа, то всё же ОК, нет?
Вы можете записать гифку/видео как у Вас работает реализации функции фильтрации?

Lemieux

Цитата: Михаил88 от 28.08.24, 11:11:16Если включить режим каркас то получится.

Согласен, но если сборка очень большая, то точек может быть не видно. А хотелось бы просто тыкать в точки.

Vi2

Цитата: Lemieux от 28.08.24, 12:52:32Вы можете записать гифку/видео как у Вас работает реализации функции фильтрации?
У меня нет таких средств. У сотрудника есть, но он в отпуске. Могу привести функцию фильтрации
    virtual BOOL WINAPI filterProc(IEntity* entity)
    {
        if (entity == NULL)
            return TRUE; // пусть разбирается selectProc

#if defined(_DEBUG)
        ksObj3dTypeEnum type = (ksObj3dTypeEnum)entity->GetType();
#endif // defined(_DEBUG)

        BOOL rc = FALSE;
        if (entity->IsIt(o3d_vertex))
        {
            rc = FALSE; // пропускаем, хотя может быть полезно
        }
        else if (entity->IsIt(o3d_edge))
        {
            IEdgeDefinitionPtr edge(IUnknownPtr(entity->GetDefinition(), NOADDREF));
            if ((pickmask & PickMode_3DBoundaryEdge) != 0 && isbound(edge))
                rc = true;
            else if (edge->GetSketchEdge())
                rc = ((pickmask & (PickMode_2D | PickMode_2Dchain)) != 0);
            else
                rc = ((pickmask & (PickMode_3DEdge | PickMode_3DTangentEdge)) != 0);
        }
        else if (entity->IsIt(o3d_face))
        {
            rc = ((pickmask & (PickMode_3DFace | PickMode_3DFaceBound | PickMode_3DTangentFace | PickMode_3DTangentFaceEdge)) != 0);
        }
        else if ((pickmask & (PickMode_2D | PickMode_3DEdge | PickMode_3DFace)) != 0)
        {
            IFeaturePtr feature(entity->GetFeature(), NOADDREF);
            IEntityCollectionPtr ec(feature->EntityCollection((pickmask & PickMode_3DFace) != 0 ? o3d_face : o3d_edge), NOADDREF);
            if (ec && ec->GetCount())
                rc = TRUE;
        }
        return rc;
    }
Ну в общих чертах: курсор ведешь по модели, и подсвечиваются нужные элементы. pickmask определяется комбобоксами на Панели свойств.
virtual void OnChangeControlValue(long ctrlID, const VARIANT& newVal)
{
if (ctrlID == CTRLID_2DEDGES)
{
if (V_I4(&newVal) != 0)
pickmask |= PickMode_2D;
else
pickmask &= ~PickMode_2D;
return;
}
...
}
+ Благодарностей: 1

Михаил88

Тоже попробовал UserSelectEntity, написал функцию фильтрации, которая возвращает True или False в зависимости от типа объекта под курсором. У меня тоже все подряд подсвечивает.
Хотя если использую UserGetPlacementAndEntity и задаю функцию фильтрации через SetFilterCallBackEx то все работает и подсвечиваются только те объекты под курсором, что подходят по условию.

P.S. К18.1, python.
+ Благодарностей: 1

Lemieux

Цитата: Михаил88 от 29.08.24, 07:39:17Тоже попробовал UserSelectEntity, написал функцию фильтрации, которая возвращает True или False в зависимости от типа объекта под курсором. У меня тоже все подряд подсвечивает.
Хотя если использую UserGetPlacementAndEntity и задаю функцию фильтрации через SetFilterCallBackEx то все работает и подсвечиваются только те объекты под курсором, что подходят по условию.

P.S. К18.1, python.
Спасибо. Значит не я один такой.

Lemieux

Сейчас сделал вот такой тестовый код

KompasObject application5 = Marshal.GetActiveObject("KOMPAS.Application.5") as KompasObject;
ksDocument3D document3D = application5.ActiveDocument3D();
ksPart part = (ksPart)document3D.GetPart((int)Part_Type.pTop_Part);
ksRequestInfo3D info = (ksRequestInfo3D)document3D.GetRequestInfo(part);
info.prompt = "Укажите объект";
info.SetFilterCallBack("SELECTFILTERPROC", 0, null);
info.SetCallBack("SELECTCALLBACKPROC", 0, null);
document3D.UserGetPlacementAndEntity(1);
Функции SELECTFILTERPROC SELECTCALLBACKPROC просто возвращают true/1 или false/0, при этом перестают подсвечиваться и выделяться объекты.

Lemieux

Что интересно в API7, вот этот процесс фильтрует

Process3D process3D = kompasDocument3D.LibProcess[ksProcess3DTypeEnum.ksProcess3DPlacementAndEntity];
А вот этот процесс не фильтрует
Process3D process3D = kompasDocument3D.LibProcess[ksProcess3DTypeEnum.ksProcess3DSelectEntity];
И ещё интересно зачем вот это свойство если оно ни на что не влияет
process3D.ObjectsFilter3D[ksProcessObjectsFilter3DEnum.ksProcessFilterObjects] = true;

PS какое же днище API компас.

UU

Эта - UserGetPlacementAndEntity, работает четко, с другими нужно думать.