Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Тема начата: Lemieux от 24.08.24, 09:25:28

Название: Режим фильтрации
Отправлено: Lemieux от 24.08.24, 09:25:28
Всех приветствую. Как программно включить режим фильтрации по точке?
Название: Re: Режим фильтрации
Отправлено: UU от 24.08.24, 10:21:50
Цитата: Lemieux от 24.08.24, 09:25:28Всех приветствую. Как программно включить режим фильтрации по точке?
Купить журнал, сделай сам.
Название: Re: Режим фильтрации
Отправлено: Lemieux от 24.08.24, 12:14:49
Цитата: UU от 24.08.24, 10:21:50Купить журнал, сделай сам.
Спасибо, что поделились своим опытом. Надеюсь на форуме есть адекватные люди, подожду их ответа.
Название: Re: Режим фильтрации
Отправлено: lavgirb от 25.08.24, 07:57:34
Цитата: Lemieux от 24.08.24, 09:25:28Как программно включить режим фильтрации по точке?
В справке есть ObjectsFilter3D. И ksObjectsFilter3DEnum с ksFilterPoints3D. Не оно?
Название: Re: Режим фильтрации
Отправлено: Lemieux от 26.08.24, 08:31:24
Цитата: lavgirb от 25.08.24, 07:57:34В справке есть ObjectsFilter3D. И ksObjectsFilter3DEnum с ksFilterPoints3D. Не оно?
Да я хотел узнать как включать кнопку "Фильтровать ***". Например "Фильтровать компоненты".
Screenshot 2024-08-26 082853.png
Название: Re: Режим фильтрации
Отправлено: Lemieux от 26.08.24, 09:02:39
Вот такая байда в процессе

Цитироватьprocess3D.ObjectsFilter3D[ksProcessObjectsFilter3DEnum.ksProcessFilterParts] = true;


И вот тако метод в эвенте ksProcess3DNotify

Цитироватьpublic bool FilterObject(object Object)
{
    if (Object is IModelObject modelObject)
    {
        if (modelObject.Type == KompasAPIObjectTypeEnum.ksObjectPart7)
            return true;
    }
    return false;
}

Не работают как мне надо.
Название: Re: Режим фильтрации
Отправлено: Lemieux от 26.08.24, 10:29:11
Скомпилировал и протестировал Step2_API7_3D. Там как раз используется метод "UserSelectEntity". По описанию функции фильтрации "SELECTFILTERPROC" должно  всё работать как кнопка "Фильтровать", но не работает даже в примере от АСКОН. Подсвечивает всё во время предварительного выбора.
Название: Re: Режим фильтрации
Отправлено: UU от 26.08.24, 12:34:34
Так это Ваша задача отслеживать в данной функци, что подсвечивать, а что нет.
Название: Re: Режим фильтрации
Отправлено: p3452 от 26.08.24, 12:53:09
Цитата: Lemieux от 26.08.24, 09:02:39Не работают как мне надо.
Пример с Форума... (https://forum.ascon.ru/index.php?action=dlattach;attach=2478)
Название: Re: Режим фильтрации
Отправлено: Lemieux от 26.08.24, 14:01:24
Цитата: UU от 26.08.24, 12:34:34Так это Ваша задача отслеживать в данной функци, что подсвечивать, а что нет.
Если я просто в функции ставлю "return false", то всё равно подсвечивается всё подряд.

Цитата: p3452 от 26.08.24, 12:53:09Пример с Форума... (https://forum.ascon.ru/index.php?action=dlattach;attach=2478)

Ошибка подключения
Название: Re: Режим фильтрации
Отправлено: p3452 от 26.08.24, 17:31:11
Цитата: Lemieux от 26.08.24, 14:01:24Ошибка подключения
Ну, еще бы не было ошибки - 2007 год!
Там есть исходники...
1. "SELECTFILTERPROC" - это всего лишь имя процедуры (функции), которую Вы должны сами написать.
2. И возвращаемые параметры (параметр) Вы, то же сами, должны интерпретировать.
Название: Re: Режим фильтрации
Отправлено: Lemieux от 26.08.24, 19:21:22
Цитата: p3452 от 26.08.24, 17:31:111. "SELECTFILTERPROC" - это всего лишь имя процедуры (функции), которую Вы должны сами написать.
Это я понял ещё из примеров C#

Цитата: p3452 от 26.08.24, 17:31:112. И возвращаемые параметры (параметр) Вы, то же сами, должны интерпретировать.
Это как понимать?

Никто не понимает какого эффекта я хочу добиться? Или просто у меня не работает API?
Название: Re: Режим фильтрации
Отправлено: p3452 от 26.08.24, 20:43:19
Цитата: Lemieux от 26.08.24, 19:21:22Это как понимать?
- Понимать именно так как написано!!!

На примере Вашей функции "FilterObject(object Object)" - то, что функцию назвали "FilterObject" не придало ей функций соответствующих названию - функция, всего лишь, проверяет тип переданного ей объекта заданному и возвращает true или false.
А уж, как интерпретировать ЭТИ значения и что, при этом, делать - Ваша забота...

Название: Re: Режим фильтрации
Отправлено: Lemieux от 27.08.24, 08:13:50
Цитата: p3452 от 26.08.24, 20:43:19А уж, как интерпретировать ЭТИ значения и что, при этом, делать - Ваша забота...
Что значит моя забота интерпретировать возвращаемы значения?
Эта функция является одной из функций реализации интерфейса. Эта функция возвращает значение тому объекту, который в данный момент юзает этот интерфейс. Интерпретировать должен КОМПАС, а не я.
Теперь читаем хелп по API7

ЦитироватьFilterObject - Фильтрация объектов под курсором
Возвращаемое значение:

TRUE
- если объект подходит.

Входные параметры:

Object
- указатель на объект под курсором:
при использовании автоматизации указатель IModelObject, IPart7, IBody7, IMateConstraint3D в зависимости от типа выбранного объекта,
при использовании COM указатель IEntity, IPart, IBody, IMateConstraint в зависимости от типа выбранного объекта.

Теперь хелп API5

ЦитироватьUserSelectEntity - Запустить процесс выбора объекта
Входные параметры:

defObject
- указатель на объект по умолчанию, который будет подсвечен при запуске процесса,

methodName
- название функции фильтрации или NULL,

prompt
- строка подсказки или NULL,

hInstance
- hInstance модуля, в котором находится функция фильтрации,

dispatchOCX
- интерфейс, в котором находится функция фильтрации, если hInstance не доступен.

Тип функции фильтрации:
bool WINAPI SELECTFILTERPROC (LPDISPATCH _entity)
Пользователь может указать процессу, подходит ему по каким-то соображениям присланный объект или нет. Если функция фильтрации возвращает TRUE, значит, объект подходит, и он будет подсвечен процессом.
Во всех программах, в которых работал до этого, функция фильтрации работает как кнопка "Фильтровать ****" и как описывает SDK. Но по тестам выходит, что КОМПАС сначала подсвечивает объект, а потом уже фильтрует. И я в этих функциях "FilterObject" или "SELECTFILTERPROC" могу возвращать постоянно хоть true, хоть false, объект постоянно подсвечивается под курсором.
К сожалению поддержка АСКОН по SDK покупается отдельно и пока её не купили.
Название: Re: Режим фильтрации
Отправлено: UU от 27.08.24, 20:23:59
У Вас есть объект и Вы с ним можете делать, что захотите, в Вашей функции фильтрации.
Название: Re: Режим фильтрации
Отправлено: Vi2 от 27.08.24, 20:35:05
Цитата: UU от 27.08.24, 20:23:59У Вас есть объект и Вы с ним можете делать, что захотите, в Вашей функции фильтрации.
Функция фильтрации предназначена не для обработки а для выделения объекта. Обработку должен делать вызывающий код, потому что функция выбора объекта с одной и той же функцией фильтрации может вызвана для разных мест бизнес-логики.

Я думаю, что стоит показать код, иначе это просто разговоры. Также думаю, что просто функция FilterObject не передаётся в процесс выбора. Причём системная фильтрация не влияет на передачу объектов в эту функцию.

PS
Мы в нашей программе используем UserGetPlacementAndEntity, всё работает как заявлено:
"При захвате курсором объекта модели этот объект передается в функцию фильтрации, где можно проверить его тип и сообщить процессу, подходит объект или нет.
Если объект подходит, то он подсвечивается на экране.
После указания объекта он передается в функцию выбора, где его можно добавить в массив объектов и изменить строку приглашения.
Объекты, попавшие в массив, выделяются на экране."

ksEntity obj1 = (ksEntity)doc3D.UserSelectEntity( null, "UserFilterProc", LoadString("IDS_OBJ1"), 0, this );

    public bool UserFilterProc( object e )
    {
      ksEntity entity = (ksEntity)e;

      if( e != null && (oType == 0 || entity.type == oType) )
      {
        return true;
      }
      else
        return false;
    }
Название: Re: Режим фильтрации
Отправлено: UU от 27.08.24, 20:43:00
У меня он работает, а показывать я ни кому не должен.
Название: Re: Режим фильтрации
Отправлено: Vi2 от 28.08.24, 03:31:38
Цитата: UU от 27.08.24, 20:43:00У меня он работает, а показывать я ни кому не должен.
Я так понимаю, мои слова относились к Lemieux, а не к Вам.
Название: Re: Режим фильтрации
Отправлено: Lemieux от 28.08.24, 08:15:53
Цитата: Vi2 от 27.08.24, 20:35:05Объекты, попавшие в массив, выделяются на экране.

Подсвечиваются под курсором или выделаются после нажатия ЛКМ?

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

Попробуйте скачать от сюда.
https://drive.google.com/file/d/1BMNvS0OU0lo55Y1VtffPD7IUDJKDSAiz/view?usp=sharing (https://drive.google.com/file/d/1BMNvS0OU0lo55Y1VtffPD7IUDJKDSAiz/view?usp=sharing)

Цитата: Vi2 от 27.08.24, 20:35:05ksEntity obj1 = (ksEntity)doc3D.UserSelectEntity( null, "UserFilterProc", LoadString("IDS_OBJ1"), 0, this );

    public bool UserFilterProc( object e )
    {
      ksEntity entity = (ksEntity)e;

      if( e != null && (oType == 0 || entity.type == oType) )
      {
        return true;
      }
      else
        return false;
    }
Я точно такую же реализацию делал из примера SDK, и у меня всё подряд подсвечивается, даже есть просто оставить одну строку "return false"

Цитата: UU от 27.08.24, 20:43:00У меня он работает, а показывать я ни кому не должен.
Да мы уже поняли, что Вы кантабол.
Название: Re: Режим фильтрации
Отправлено: Starik от 28.08.24, 08:28:22
Цитата: Lemieux от 28.08.24, 08:15:53Да мы уже поняли, что Вы кантабол.

Вот не знаю, что это слово обозначает. Но если оно ругательное то..............

scale_1200.jpg
Название: Re: Режим фильтрации
Отправлено: Lemieux от 28.08.24, 08:41:00
Цитата: Starik от 28.08.24, 08:28:22Вот не знаю, что это слово обозначает. Но если оно ругательное то..............

scale_1200.jpg
Кант любил заниматься метафизикой. Я думаю, кто читал Канта, а потом Ницше, поймут.
Название: Re: Режим фильтрации
Отправлено: Vi2 от 28.08.24, 11:09:13
Цитата: Lemieux от 28.08.24, 08:15:53Подсвечиваются под курсором или выделаются после нажатия ЛКМ?

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

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

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

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

Я не совсем знаю Компас и не использовал UserSelectEntity, т.к. используем UserGetPlacementAndEntity. Если на ГИФке работает Ваша программа, то всё же ОК, нет?
Название: Re: Режим фильтрации
Отправлено: Михаил88 от 28.08.24, 11:11:16
Цитата: Lemieux от 28.08.24, 08:15:53Просто наставьте внутри любой большой сборки точек и попробуйте их выделить, у Вас не получится.

Если включить режим каркас то получится.
Название: Re: Режим фильтрации
Отправлено: Lemieux от 28.08.24, 12:51:57
Цитата: Vi2 от 28.08.24, 11:09:13Я не совсем знаю Компас и не использовал UserSelectEntity, т.к. используем UserGetPlacementAndEntity. Если на ГИФке работает Ваша программа, то всё же ОК, нет?
Это пример включенной кнопки "Фильтровать точки".
Название: Re: Режим фильтрации
Отправлено: Lemieux от 28.08.24, 12:52:32
Цитата: Vi2 от 28.08.24, 11:09:13Когда курсор движется по экрану, то подсвечиваются только те элементы, для которого функция фильтрации возвращает Да. Если кликнуть ЛКМ, то элемент выделяется уже селектором, которому, возможно, даются плюс совершенно другие элементы, например, гладкие сопряжения с кликнутой гранью.

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

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

Я не совсем знаю Компас и не использовал UserSelectEntity, т.к. используем UserGetPlacementAndEntity. Если на ГИФке работает Ваша программа, то всё же ОК, нет?
Вы можете записать гифку/видео как у Вас работает реализации функции фильтрации?
Название: Re: Режим фильтрации
Отправлено: Lemieux от 28.08.24, 12:53:15
Цитата: Михаил88 от 28.08.24, 11:11:16Если включить режим каркас то получится.

Согласен, но если сборка очень большая, то точек может быть не видно. А хотелось бы просто тыкать в точки.
Название: Re: Режим фильтрации
Отправлено: Vi2 от 28.08.24, 21:39:29
Цитата: 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;
}
...
}
Название: Re: Режим фильтрации
Отправлено: Михаил88 от 29.08.24, 07:39:17
Тоже попробовал UserSelectEntity, написал функцию фильтрации, которая возвращает True или False в зависимости от типа объекта под курсором. У меня тоже все подряд подсвечивает.
Хотя если использую UserGetPlacementAndEntity и задаю функцию фильтрации через SetFilterCallBackEx то все работает и подсвечиваются только те объекты под курсором, что подходят по условию.

P.S. К18.1, python.
Название: Re: Режим фильтрации
Отправлено: Lemieux от 29.08.24, 08:06:37
Цитата: Михаил88 от 29.08.24, 07:39:17Тоже попробовал UserSelectEntity, написал функцию фильтрации, которая возвращает True или False в зависимости от типа объекта под курсором. У меня тоже все подряд подсвечивает.
Хотя если использую UserGetPlacementAndEntity и задаю функцию фильтрации через SetFilterCallBackEx то все работает и подсвечиваются только те объекты под курсором, что подходят по условию.

P.S. К18.1, python.
Спасибо. Значит не я один такой.
Название: Re: Режим фильтрации
Отправлено: Lemieux от 29.08.24, 16:22:56
Сейчас сделал вот такой тестовый код

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, при этом перестают подсвечиваться и выделяться объекты.
Название: Re: Режим фильтрации
Отправлено: Lemieux от 29.08.24, 16:45:06
Что интересно в API7, вот этот процесс фильтрует

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

PS какое же днище API компас.
Название: Re: Режим фильтрации
Отправлено: UU от 29.08.24, 16:48:14
Эта - UserGetPlacementAndEntity, работает четко, с другими нужно думать.