Перебор базовых объектов спецификации с группировкой

Автор Andreych, 29.02.24, 09:16:25

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

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

Andreych

Хочу пройти по всем видимым строкам в спецификации и заменить базовые объекты на вспомогательные с помощью итератора.

iter.ksCreateSpcIterator('', 0, 0) // итератор по базовым объектам
obj:=iter.ksMoveIterator('N');

Но в случае, когда одинаковые объекты сгруппированы, то итератор перебирает все одинаковые объекты и вместо 1 строки с кол-вом N шт появляется N вспомогательных объектов с кол-вом по 1шт.
Не могу найти в API как определить, что текущий объект obj входит в группу и как получить кол-во объектов в этой группе.


Вират Лакх

Здравствуйте, Andreych.
Давно Вас не видно было. С возвращением.
Вы про какую версию компаса и про какую группировку? Ту самую, которая в v21?
Сдался Вам этот итератор? Я бы к нему обращался при глюках через API7.
Если надо видимые строки, возьмите ISpecificationDescription.Objects
https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/ispecificationdescription_objects.html
Базовые абсолютно все идут. А в v21 всё подряд: групповые и настоящие базовые.

Andreych

Приветствую, Вират Лакх.
Спасибо! :)
Я про Компас 21 и вот такую кнопку группировки
Группа.png

Попробую как-нибудь API7 в спецификации.
А пока я вроде нашел способ читать сгруппированные объекты в моей программке, через итератор.
Количество сгруппированных объектов для объекта obj похоже возвращает функция ksGetSpcObjectSummaryCount(obj,0,0).
Если это кол-во больше 0, значит объект сгруппирован. А отображаемое в спецификации количество можно брать от первого такого объекта в группе.

Вират Лакх

Цитата: Andreych от 29.02.24, 13:30:47А пока я вроде нашел способ читать сгруппированные объекты в моей программке, через итератор.
Это про простые базовые внутри группового? Или групповые в спецификации?
Если именно в v21 получится у группового объекта получить его внутренние объекты, то дайте списать :grin:
В v21, похоже, только как-то через итератор, т.к. IGroupObjectsManager появился в v22. Я сделал через включение/отключение ShowAllObjects.
Цитата: Andreych от 29.02.24, 09:16:25Не могу найти в API как определить, что текущий объект obj входит в группу
https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/igroupobjectsmanager_findgroupobject.html
Вам все базовые перебирать не надо уж, наверное, если хотите просто групповой базовый заменить на вспомогательный. А пойти от списка видимых объектов.
Кстати, преобразование базовый <-> вспомогательный не завезли ещё? Я особо не интересовался, но вроде как будто мелькало что-то...
Цитата: Andreych от 29.02.24, 13:30:47Количество сгруппированных объектов для объекта obj похоже возвращает функция ksGetSpcObjectSummaryCount(obj,0,0).
Вообще, это просто чтение колонки Кол-во. Но как она себя ведёт с групповыми объектами, надо проверять.

Andreych

Цитата: Вират Лакх от 29.02.24, 14:59:14Это про простые базовые внутри группового? Или групповые в спецификации?
Не совсем понял что это. Я видимо про простые базовые внутри группового. Когда строка в спецификации одна с количеством 5, но на самом деле это группа из 5 одинаковых объектов с кол-вом по 1шт каждого. И итератор перебирает их все 5 вместо одной строки.
Но та же деталь может быть одним объектом с количеством 5.
И чтобы отличить независимый объект от объекта, входящего в группу, я использую функцию ksGetSpcObjectSummaryCount, для всех независимых объектов она возвращает 0, для входящих в группу - 1 и более. А для первого объекта в группе эта функция возвращает общее кол-во объектов в этой группе.

Цитата: Вират Лакх от 29.02.24, 14:59:14Вообще, это просто чтение колонки Кол-во. Но как она себя ведёт с групповыми объектами, надо проверять.
Нет, это разные вещи. Например, в данной строке спецификации видно количество 5. Если у одиночного объекта чтение колонки Кол-во выдаст значение 5, то у аналогичного группового объекта чтение колонки Кол-во выдаст значение 1, для следующего еще 1 и так 5 раз.

Цитата: Вират Лакх от 29.02.24, 14:59:14Кстати, преобразование базовый <-> вспомогательный не завезли ещё? Я особо не интересовался, но вроде как будто мелькало что-то...
Я ранее уже создавал тему про замену базовый <-> вспомогательный в 2018г.
https://forum.ascon.ru/index.php?topic=31930.msg257885#msg257885
A также ТрындецЪ представлял программу на Питоне для такой замены, после небольшого исправления она у меня заработала.
https://forum.ascon.ru/index.php/topic,31324.0.html

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

Вират Лакх

Цитата: Andreych от 29.02.24, 23:45:51Когда строка в спецификации одна с количеством 5, но на самом деле это группа из 5 одинаковых объектов с кол-вом по 1шт каждого.
На самом деле "одна с количеством 5" - это один базовый групповой объект, а "5 одинаковых объектов с кол-вом по 1шт каждого" - это другие "нормальные" базовые объекты. Похоже, что они все валяются в одной куче, т.к. ISpecificationBaseObjects выдаёт и те, и другие.
Так вам удалось в 21 перебрать базовые простые внутри базового группового, а не всё подряд?
Групповой или негрупповой объект - IsGroupObject (v22). В v21 как аналог можно использовать ShowAllObjects.
Чтобы отличить независимый объект от объекта, входящего в группу, ISpecificationBaseObject.GroupObject - Группировать объект. В 21 работает.
https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/groupobject.html - там пишут, что "Версия КОМПАС v22", но это они врут, как частенько бывает.
Нечто похожее на вашу программу: https://forum.ascon.ru/index.php?msg=268851

Andreych

Похоже на API7 перебор объектов спецификации проще, чем я делаю на API5. :)
Этот мой итератор перебирает именно все базовые объекты подряд. И приходится для каждого следующего объекта определять простой он или входит в группу. Если входит в группу, то последующие объекты тоже входят в эту группу, пока опять не встретится простой объект. Таким образом можно считать, что перебираем простые объекты в группе.
Ваша программа копирует групповую строку как раз как надо, с общим количеством. Видимо потому, что у вас перебор по видимым объектам. А моя программка (как и программа от ТрындецЪ) раньше копировала каждый объект в группе как отдельный с кол-вом 1шт.
Да, ваша программа похожа на то, что я делаю.
Я тоже пытаюсь сделать, чтобы объект спецификации копировался или переносился в другой раздел как базовый или вспомогательный. Чтобы можно было конвертировать объекты не все сразу, а в выбранных разделах. И чтобы копировать объекты не по одному, а сразу несколько выбрать и за один раз скопировать. Такие вот хотелки.

Andreych

Цитата: Вират Лакх от 01.03.24, 06:48:36Чтобы отличить независимый объект от объекта, входящего в группу, ISpecificationBaseObject.GroupObject - Группировать объект. В 21 работает.
А у меня ISpecificationBaseObject.GroupObject не работает в 21 Компасе. По крайней мере Delphi такое не компилирует.

Еще мне пока непонятно как в групповой спецификации, где 3 или 10 колонок, получить количество для каждого исполнения?

Вират Лакх

Может ISpecificationBaseObject.GroupObject у вас там как метод идёт? В библиотеке типов он есть же.
col = ISpecificationObject.Columns.Item(j)
ISpecificationBaseObject.SummaryCount(col.ColumnTypeNumber, col.BlockNumber)
Если этого мало будет или не будет работать в v21, то есть ещё вариант.

Andreych

В Delphi у ISpecificationBaseObject нет свойства или метода GroupObject. Может в Питоне есть, но в Delphi не завезли.
Про количество в строке для каждого исполнения как я раньше не понял. Я думал кол-во для разных исполнений это какие-то подгруппы в колонке №5 "Количество", а оказывается это просто разные колонки ISpecificationBaseObject.Columns[5], 6, 7 и т.д.