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

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

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

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

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

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

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

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

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

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

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

Lemieux

Всех приветствую. Как программно включить режим фильтрации по точке?

UU

Цитата: Lemieux от 24.08.24, 09:25:28Всех приветствую. Как программно включить режим фильтрации по точке?
Купить журнал, сделай сам.

Lemieux

Цитата: UU от 24.08.24, 10:21:50Купить журнал, сделай сам.
Спасибо, что поделились своим опытом. Надеюсь на форуме есть адекватные люди, подожду их ответа.

lavgirb

Цитата: Lemieux от 24.08.24, 09:25:28Как программно включить режим фильтрации по точке?
В справке есть ObjectsFilter3D. И ksObjectsFilter3DEnum с ksFilterPoints3D. Не оно?

Lemieux

Цитата: lavgirb от 25.08.24, 07:57:34В справке есть ObjectsFilter3D. И ksObjectsFilter3DEnum с ksFilterPoints3D. Не оно?
Да я хотел узнать как включать кнопку "Фильтровать ***". Например "Фильтровать компоненты".
Screenshot 2024-08-26 082853.png

Lemieux

Вот такая байда в процессе

Цитировать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;
}

Не работают как мне надо.

Lemieux

Скомпилировал и протестировал Step2_API7_3D. Там как раз используется метод "UserSelectEntity". По описанию функции фильтрации "SELECTFILTERPROC" должно  всё работать как кнопка "Фильтровать", но не работает даже в примере от АСКОН. Подсвечивает всё во время предварительного выбора.

UU

Так это Ваша задача отслеживать в данной функци, что подсвечивать, а что нет.

p3452

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

Lemieux

Цитата: UU от 26.08.24, 12:34:34Так это Ваша задача отслеживать в данной функци, что подсвечивать, а что нет.
Если я просто в функции ставлю "return false", то всё равно подсвечивается всё подряд.

Цитата: p3452 от 26.08.24, 12:53:09Пример с Форума...

Ошибка подключения

p3452

Цитата: Lemieux от 26.08.24, 14:01:24Ошибка подключения
Ну, еще бы не было ошибки - 2007 год!
Там есть исходники...
1. "SELECTFILTERPROC" - это всего лишь имя процедуры (функции), которую Вы должны сами написать.
2. И возвращаемые параметры (параметр) Вы, то же сами, должны интерпретировать.

Lemieux

Цитата: p3452 от 26.08.24, 17:31:111. "SELECTFILTERPROC" - это всего лишь имя процедуры (функции), которую Вы должны сами написать.
Это я понял ещё из примеров C#

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

Никто не понимает какого эффекта я хочу добиться? Или просто у меня не работает API?

p3452

Цитата: Lemieux от 26.08.24, 19:21:22Это как понимать?
- Понимать именно так как написано!!!

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


Lemieux

Цитата: 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 покупается отдельно и пока её не купили.

UU

У Вас есть объект и Вы с ним можете делать, что захотите, в Вашей функции фильтрации.

Vi2

Цитата: 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;
    }

UU

У меня он работает, а показывать я ни кому не должен.

Vi2

Цитата: UU от 27.08.24, 20:43:00У меня он работает, а показывать я ни кому не должен.
Я так понимаю, мои слова относились к Lemieux, а не к Вам.

Lemieux

Цитата: Vi2 от 27.08.24, 20:35:05Объекты, попавшие в массив, выделяются на экране.

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

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

Попробуйте скачать от сюда.
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У меня он работает, а показывать я ни кому не должен.
Да мы уже поняли, что Вы кантабол.

Starik

Цитата: Lemieux от 28.08.24, 08:15:53Да мы уже поняли, что Вы кантабол.

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

scale_1200.jpg
+ Благодарностей: 1