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

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

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

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

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

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

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

Компас вылетает при вызове свойств 3D объекта

Автор Простой_инженер, 09.08.23, 09:13:56

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

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

Простой_инженер

Суть: когда мы щелкаем мышью по 3D объекту в сборке, то по умолчанию выделяем либо грань, либо вершину, либо поверхность 3D объекта. Данная функция выделяет нам объект целиком и показывает его местоположение в дереве.

Сама функция работает в отдельном потоке на постоянке с перерывом в 50 мс. Все работает отлично. Я могу с выделенным объектом производить дальнейшие операции как с помощью программного кода, так и с помощью мыши. Но есть ньюанс: щелкая по выделенному объекту правой кнопкой мыши и выбирая из выпадающего списка пункт "Свойства компонента", Компас на секунду зависает, а потом аварийно закрывается. При этом если я тоже самое проделываю только с выделенным объектом в дереве, то вылета не происходит.

Я проводил разные эксперименты, чтобы выяснить в каком месте происходит вылет. Даже пытался вызвать "Свойства компонента" после закрытия моей программы. В общем пришел к выводу, что моя функция как-то баговано выделяет объект. Какие ваши предложения будут по решению данной проблемы? У меня ощущение, что я что-то забыл сделать из-за чего объект выделяется не до конца.

Function SelectBodyDocument3D: ksPart;
var
  Document3D: ksDocument3D;
  SelectionMng: ksSelectionMng;
  Entity: ksEntity;
  Part: ksPart;
  KompasCommandEnum: ksKompasCommandEnum;
begin
  Result:=nil;

  if GetTypeActiveDocument=6 then //Моя функция, которая проверяет тип активного файла. Цифра 6 - это файл с типом Сборка.
    begin
      Document3D:=GetActiveDocument3D; //Получаем активный файл
      SelectionMng:=ksSelectionMng(Document3D.GetSelectionMng); //Получаем менеджер выделенный объектов
      if SelectionMng.GetCount=1 then //Проверяем, чтобы в менеджере выделенных объектов был выделен только 1 объект
        begin
          Entity:=ksEntity(SelectionMng.First); //Получаем выделенный объект
          if Entity.type_ in [6..8] then //Проверяем, чтобы выделенный объект был точкой, вершиной или поверхностью
            begin
              Part:=ksPart(Entity.GetParent); //Получаем родителя этого объекта. В данном случае это непосредственно сама 3D деталь
              Result:=Part;

              SelectionMng.UnselectAll; //Очищаем менеджер выделенных объектов
              SelectionMng.Select(Part); //Добавляем в менеджер выделенных объектов нашу деталь

              KompasCommandEnum:=ksCMViewFeatureInTree; //Команда системы Компас для отображения выделенной детали в дереве
              KompasOBJ.ksExecuteKompasCommand(KompasCommandEnum,False); //Вызов этой команды.
            end;
        end;
    end;
end;

Scull_


Простой_инженер

Цитата: Scull_ от 09.08.23, 09:38:37Зачем работать отдельным потоком?

Для своих задач необходимо это делать. Да и вообще не суть. Оно и в главном потоке не работает.

Scull_

На события, Вы подписку не делали, иначе смысла в этом отдельном потоке нет.
PS. Вылет в отладчике нужно ловить,  скорее всего ksExecuteKompasCommand с чем-то конфликтует.
+ Благодарностей: 1

Простой_инженер

Цитата: Scull_ от 09.08.23, 10:32:02На события, Вы подписку не делали, иначе смысла в этом отдельном потоке нет.
PS. Вылет в отладчике нужно ловить,  скорее всего ksExecuteKompasCommand с чем-то конфликтует.

Проверял много раз. Проблема не в ksExecuteKompasCommand это точно. Для уверенности я его даже убирал.

Scull_

В любом случае отладчик, весь код у Вас.
+ Благодарностей: 1

Простой_инженер

Цитата: Scull_ от 09.08.23, 10:53:17В любом случае отладчик, весь код у Вас.

Смотрел. Моя программа стабильно работает до тех пор, пока Компас не закроется сам.

Vi2

Т.е. это Компас падает, или Ваша программа, которая работает внутри Компаса, падает?

Scull_

Цитата: Простой_инженер от 09.08.23, 11:08:30Смотрел. Моя программа стабильно работает до тех пор, пока Компас не закроется сам.
Ваша программа может работать стабильно и также стабильно ложить Компас.
Смотрите в сторону синхронизации потоков и возможности выполнить команду Компасом, т.е. он не занят выполнением другой задачи.

Валерий Изранов

Цитата: Простой_инженер от 09.08.23, 09:13:56Сама функция работает в отдельном потоке на постоянке с перерывом в 50 мс
Откуда известно, как работает команда Компаса?
И как это связано с самодельной программой.

Цитата: Scull_ от 10.08.23, 08:12:05и возможности выполнить команду Компасом, т.е. он не занят выполнением другой задачи

Чем он может быть занят, если управляется самодельной программой.
Обычно зависание Компаса происходит из за неправильного использования команд API

Scull_

Цитата: Валерий Изранов от 10.08.23, 09:28:57Чем он может быть занят, если управляется самодельной программой.
Обычно зависание Компаса происходит из за неправильного использования команд API
Откуда мы знаем, как он управляется?
Может быть занят чем угодно.

Валерий Изранов

У автора есть только Компас и самодельная программа для управления.
Ничем другим Компас занят быть НЕ МОЖЕТ.

Простой_инженер

Цитата: Vi2 от 10.08.23, 08:02:06Т.е. это Компас падает, или Ваша программа, которая работает внутри Компаса, падает?

Сам Компас падает. Моя программа работает без сбоев. Она только выделяет 3D деталь/подсборку и указывает место расположения в дереве.

Проблема заключается в том, что выделенный объект оказывается багованым. Стоит мне с помощью мыши вызвать свойства у него и Компас падает. Это происходит даже, если я после выделения закрою свою программу. Но при этом я могу спокойно открывать свойства объекта через дерево и менять их. И даже программно менять свойства тоже могу.

Забыл указать. Версия Компаса: V.21

Простой_инженер

Посмотрел в сведеньях о проблеме в Windows, в общем критическая ошибка Компаса возникает в модуле k3DDoc.dll.

Doom

А если использовать True в аргументах ksExecuteKompasCommand ?

True  - запуск команды через PostMessage, функция не возвращает ответа и поток отработает быстрее.
Может попробовать организовать пул потоков с ожиданием завершения предыдущего - что бы быть уверенным что не попадете на момент работы потока ?

Простой_инженер

Цитата: Doom от 10.08.23, 21:51:56А если использовать True в аргументах ksExecuteKompasCommand ?

True  - запуск команды через PostMessage, функция не возвращает ответа и поток отработает быстрее.
Может попробовать организовать пул потоков с ожиданием завершения предыдущего - что бы быть уверенным что не попадете на момент работы потока ?


Не работает. я вообще эти строки кода убирал, и ничего не менялось.

Scull_

Цитата: Простой_инженер от 14.08.23, 07:56:46Не работает. я вообще эти строки кода убирал, и ничего не менялось.
Нужно не убирать строки кода, а вылавливать отладчиком момент вылета, в сложных ситуациях приходится писать дополнительный код для отладки.

Простой_инженер

Цитата: Scull_ от 14.08.23, 10:25:14Нужно не убирать строки кода, а вылавливать отладчиком момент вылета, в сложных ситуациях приходится писать дополнительный код для отладки.
Цитата: Scull_ от 14.08.23, 10:25:14Нужно не убирать строки кода, а вылавливать отладчиком момент вылета, в сложных ситуациях приходится писать дополнительный код для отладки.

А как это сделать, если Компас сам вылетает после того как я вызову мышью свойства у выделенной детали? Это ведь никак напрямую не связано с моей программой. Это уже проблемы самого Компаса выходит.

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

Scull_

Я так понимаю, если Вашу программу вообще не запускать, то при выполнении данных действий Компас вылетает.

Простой_инженер

Цитата: Scull_ от 14.08.23, 15:35:30Я так понимаю, если Вашу программу вообще не запускать, то при выполнении данных действий Компас вылетает.

Нет. Компас вылетает, когда я вручную вызываю свойства у детали, которую мне выделила программа.