Как узнать в групповой спецификации номер блока у текущей строки?

Автор Andreych, 27.03.24, 22:20:18

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

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

Andreych

Как можно узнать в групповой спецификации со многими исполнениями и несколькими блоками исполнений, какому блоку принадлежит текущая выделенная строка?
Если это вспомогательный объект, то все просто - есть свойство ISpecificationCommentObject.BlockNumber.
У базовых объектов или у общего типа ISpecificationObject такого свойства нет.
Правда есть метод BlockNumberByIndex, который возвращает номер блока, но для этого нужно знать порядковый номер текущей строки с самого начала спецификации, а его тоже непонятно как получить.

Текущую строку получаю как SpecificationDescriptions.Active.CurrentObject. Таким образом получается ссылка на базовый объект, но он же может присутствовать сразу во всех блоках, с разным или одинаковым количеством. И в каком бы блоке ни была выделенная строка, CurrentObject ссылается на один и тот же объект (базовый). У всех таких строк в разных блоках одинаковый Reference, UniqueNumber, UniqueMetaObjectKey, не знаю как однозначно идентифицировать текущую строку. Все эти номера недостаточно уникальные получается.

Вират Лакх

Цитата: Andreych от 27.03.24, 22:20:18нужно знать порядковый номер текущей строки с самого начала спецификации, а его тоже непонятно как получить
Сработает или нет, но всё равно плохой способ: CurrentObject найти в массиве ISpecificationDescription.Objects

Вам же для количества это надо? Ответ Вы уже видели тут: https://forum.ascon.ru/index.php?msg=321770
BlockNumber есть у интерфейса колонки.

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

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

Andreych

Цитата: Вират Лакх от 28.03.24, 05:30:00Сработает или нет, но всё равно плохой способ: CurrentObject найти в массиве ISpecificationDescription.Objects

Вам же для количества это надо? Ответ Вы уже видели тут: https://forum.ascon.ru/index.php?msg=321770
BlockNumber есть у интерфейса колонки.

Я не могу найти эту строку в массиве Objects, пробовал. Пробегаю по всем объектам массива, но находится самое первое вхождение данного объекта, всегда в блоке 0. А текущая строка, например, в 3м блоке.
BlockNumber есть у интерфейса колонки, я тоже пытался это использовать. Там куча колонок, в них действительно разные номера блоков. Но опять же как узнать именно текущие колонки (для текущей строки)?

Andreych

Цитата: Валерий Изранов от 28.03.24, 06:21:50Andreych, понимаю так, что в Компасе открыта стандартная Спецификация и вы хотите
программно получить номер определенного блока из нее?
А какова конечная цель получения этого номера?
Как этот номер и блок можно использовать в дальнейшем?

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

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

Andreych, вы хотите к существующей Спецификации Компаса добавить свою оригинальную?
И оригинальная Спецификация будет положительно отличать в лучшую сторону?

Вират Лакх

Объект спецификации всегда в блоке 0. Нумерация блоков актуальна для количества. Остальные колонки "копируются" из 0 блока в последующие.
Ну тогда через BlockNumberByIndex
Вот как-то я считывал спецификацию:
    objs = iSpecificationDescription.Objects
    if objs:
        for index, obj in enumerate(objs):
            row = []
            iSpecificationColumns = obj.Columns
            if iSpecificationColumns:
                b = obj.BlockNumberByIndex(index) if obj.ObjectType == const.ksSpecificationBaseObject else 0
Цитата: Andreych от 27.03.24, 22:20:18И в каком бы блоке ни была выделенная строка, CurrentObject ссылается на один и тот же объект (базовый).
Не всегда базовый. Метод iSpecificationDescription.Objects должен возвращать кортеж ISpecificationObject. И CurrentObject тоже должен выдавать ISpecificationObject. И вот его найтить в массиве не катит? Всё равно это костыльный способ...

Это, похоже, тот случай, когда надо обратиться к API5 :%:
https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/ksspcobjparam_blocknumber.html
Заполнить ksSpcObjParam, наверное, с помощью ksGetObjParam.

Andreych

Цитата: Валерий Изранов от 28.03.24, 06:48:28Andreych, вы хотите к существующей Спецификации Компаса добавить свою оригинальную?
И оригинальная Спецификация будет положительно отличать в лучшую сторону?

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

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

Оригинальную создает сам Компас если нажать Управление-Спецификации-Создать спецификацию по документу.
Вы хотите эту Спецификацию изменить- внести в нее нужную вам строку?

Andreych

Цитата: Валерий Изранов от 28.03.24, 08:09:31Оригинальную создает сам Компас если нажать Управление-Спецификации-Создать спецификацию по документу.
Вы хотите эту Спецификацию изменить- внести в нее нужную вам строку?

Примерно так, я хочу внести изменения в любую открытую спецификацию, неважно как она была сделана.

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

Есть маленький подвох.
Программисты АСКОН потратили огромное количество человеко-часов чтобы
объединить Модель, Сборочный чертеж и Спецификацию.
Они добились того, что изменения, проведенные в Модели АВТОМАТИЧЕСКИ отражаются
на Сборочном чертеже и в Спецификации. Автоматически.
Andreych, вы хотите всю их работу ХХХХХХХХХ.
Люди вас не поймут.

Andreych

Цитата: Вират Лакх от 28.03.24, 07:24:57Не всегда базовый. Метод iSpecificationDescription.Objects должен возвращать кортеж ISpecificationObject. И CurrentObject тоже должен выдавать ISpecificationObject. И вот его найтить в массиве не катит? Всё равно это костыльный способ...

Да, в массиве Objects у меня не получается найти нужный объект (точнее его часть из нужного блока). С вспомогательными нет проблем, они в каждом блоке разные. А вот базовый объект, расположенный в нескольких блоках, это единый объект.
Похоже и правда тут нужно использовать API5, там blockNumber видимо есть для любого типа объекта.

Andreych

Цитата: Валерий Изранов от 28.03.24, 09:25:40Есть маленький подвох.
Программисты АСКОН потратили огромное количество человеко-часов чтобы
объединить Модель, Сборочный чертеж и Спецификацию.
Они добились того, что изменения, проведенные в Модели АВТОМАТИЧЕСКИ отражаются
на Сборочном чертеже и в Спецификации. Автоматически.
Andreych, вы хотите всю их работу ХХХХХХХХХХ.
Люди вас не поймут.

Это все так. Но у людей есть разные задачи, не всем и не всегда нужно все делать автоматически.
Я Вас и других не призываю делать неавтоматически, хотите делайте все автоматически и не отклоняйтесь от этого ни на шаг, но мне нужно сделать кое-что в своем формате. Зачем тогда программирование, если нужно довольствоваться тем, что автоматически реализовано Компасом.

Starik

Цитата: Валерий Изранов от 28.03.24, 09:25:40..................... вы хотите всю их работу ХХХХХХХХХ.
Люди вас не поймут.
Уважаемый Валерий Изранов. Следите за своим языком.
Делаю Вам ЗАМЕЧАНИЕ. :um:

ХХХХХХХ вместо того что там было вставил я. (Хрен это овощ. Но там был вовсе не ОВОЩ)
+ Благодарностей: 1

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

Да Алексей Павлович, немного не уследил за своим языком.
Простите меня.
+ Благодарностей: 1

p3452

Не понимаю стремление ТС (уже вторая тема) "насиловать" ассоциативные данные!?

Andreych

Цитата: p3452 от 28.03.24, 15:03:14Не понимаю стремление ТС (уже вторая тема) "насиловать" ассоциативные данные!?

:) Я не писал, что у меня ассоциативные данные. Наоборот, у меня объекты базовые, но без геометрии, без всяких связей. Можно их вообще не трогать, просто надо узнать номер блока у конкретной строки или хотя бы порядковый номер этой строки. Я не понимаю что здесь странного и некорректного?

p3452

1.
Цитата: Andreych от 29.03.24, 06:33:41:) Я не писал, что у меня ассоциативные данные. Наоборот, у меня объекты базовые, но без геометрии, без всяких связей.
Если спецификация не создана вручную, а сгенерированна Компасом (и связи не разрушены), значит данный в ней односторонне ассоциативные.
2.
Цитата: Andreych от 29.03.24, 06:33:41...просто надо узнать номер блока у конкретной строки или хотя бы порядковый номер этой строки. Я не понимаю что здесь странного и некорректного?
Вам же сказали, что BlockNumber это свойство колонки!
("Строка" состоит всех колонок (ячеек), номер блока в строке будет зависеть от того, к какой колонке относится конкретная "ячейка" строки)
Спец_номер_блока.png

Andreych

Цитата: p3452 от 29.03.24, 17:09:231.Если спецификация не создана вручную, а сгенерированна Компасом (и связи не разрушены), значит данный в ней односторонне ассоциативные.
Далась вам эта ассоциативность, она тут совсем ни при чем. У меня спецификация НЕ ассоциативная, нет никаких связей. Да если и были бы, это никак не влияет на пути решения моего вопроса.

Цитата: p3452 от 29.03.24, 17:09:232.Вам же сказали, что BlockNumber это свойство колонки!
("Строка" состоит всех колонок (ячеек), номер блока в строке будет зависеть от того, к какой колонке относится конкретная "ячейка" строки)
Сказали, я это и так прекрасно понимаю. А Вы видимо не осознали мой начальный вопрос.
Очень просто получить номер блока у любой колонки. Также просто получить номер блока у любой строки, зная ее индекс в спецификации (BlockNumberByIndex). Проблема в том, как узнать этот индекс или номер колонок именно у текущей выделенной строки, а не у всех исполнений.
Т.к. CurrentObject выдает базовый объект со всеми колонками, со всеми исполнениями, но в нем нет информации именно о конкретной текущей строке. Может еще как-то можно получить выделенную строку в спецификации?

p3452

1. Разберитесь с конечной целью - уже четыре назвали...

2. Взгляните еще раз на, правую часть "картинки" из поста №17.
Слева колонка - это и есть "номер" - ИНДЕКС строки!!!

3. Если нужна выделенная (подсвеченная) строка - это совсем другая песня...