Галочка "По источнику" у свойства "Раздел спецификации" у компонента сборки

Автор SpacePurr, 13.05.20, 23:08:01

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

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

SpacePurr

Здравствуйте.

Мне нужно проставить у всех компонентов галочку "По источнику" в true для свойства "Раздел спецификации".
Я не так хорошо знаком с Kompas API да и с сами компасом, но вот что я смог сделать.

Изначально даже строки в свойствах не было. Строчку я добавил.
Однако она была полностью неактивна(серая), но можно было при двойном клике на ячейке с разделом выбрать в открывающемся окне раздел.
Открыв компонент сборки как отдельную модель, я перешел во вкладку Управление - Спецификация - Внешний объект спецификации.
После создания спецификации у сборки таким образом, ячейка "По источнику" у "Раздела спецификации" стала активной(белой) и доступной к изменению.
Удаление строки спецификации из Управление - Спецификация - Описание спецификаций в дальнейшем не деактивировало ячейку "По источнику".

На данный момент список свойств выглядит вот так.
1.png

И так, что я пытался делать.
Во первых я пытался проделать вышеописанный путь программно. А именно:
1. Открыть сборку
2. Найти все компоненты
3. Открыть каждый компонент
4. Создать внешний объект спецификации
5. Сохранить, закрыть
6. Поставить свойство в true

Использую API5 И API7, код покажу именно конкретный кусок
c#
...

Parts7 parts = kompasDocument3D.TopPart.Parts;
foreach (IPart7 item in parts)
{
    string fileName = item.FileName;
    var doc3d_item = (ksDocument3D)kompas.Document3D();
    doc3d_item.Open(fileName, false);
    var kompasDocument_item = kompas7.ActiveDocument;
    var kompasDocument3D_item = (IKompasDocument3D)kompasDocument;

    ksSpecification spec = doc3d_item.GetSpecification();

    spec.ksSpcObjectCreate(str, 1, 15, 0, 0, 0);
    spec.ksSpcObjectEnd();

    doc3d_item.Save();
    doc3d_item.close();

    ISourcePart7Params part7Params = (ISourcePart7Params)item;
    IPropertyKeeper propertyKeeper = (IPropertyKeeper)item;
    IPropertyMng propertyManager = kompas7 as IPropertyMng;

    _Property marking = propertyManager.GetProperty(kompasDocument, 4); //обозначение
    _Property rSpec = propertyManager.GetProperty(kompasDocument, 20);  //раздел спецификации

    propertyKeeper.SetPropertyValue(marking, null, true);
    propertyKeeper.SetPropertyValue(rSpec, "", true);

    item.Update();
    break;
}
...

В дальнейшем я отказался от программного создания спецификации, ибо у меня создается только строка в Описании спецификаций, а внешний объект спецификации отсутствует, на сколько я понял и я остановился только на смене свойства.
С разделом спецификации, ясное дело, у меня ничего так и не получилось поменять.

Форум перерыл, нашел две похожие темы, но ответов в них мне не хватило для решения.
Хотелось бы узнать, что я делаю не так и как надо.
Если еще и пример будет рабочий, на любом языке, буду безмерно рад.

Спасибо.

Вират Лакх

#1
По аналогии с Обозначением и Наименованием галочка Источник с Раздела спецификации может уходить при наличии информации поверх той, что в источнике.
Попробуйте удалить/обнулить значение этого свойства, чтобы галочка установилась. С обозначением и наименованием работало, но с разделом сп может не проканать.
Upd.
И действительно, не прокатывает для версии v16.1. На вид галочка Источник может поставиться, но на деле поставленный поверх раздел остается, пока двойным кликом не зайдешь и не изменишь. Удаление и новое создание объектов спецификации ничего не дает, значит это свойство прописано в компоненте как-то еще, а само свойство Раздел спецификации получается как бы типа ведомым от даблклика.
iKompasDocument3D = API7.IKompasDocument3D(iDoc)
iTopPart = iKompasDocument3D.TopPart
iPropertyMng = API7.IPropertyMng(iApplication)
iPropertySect = iPropertyMng.GetProperty(iDoc, 20.0)
iPart7 = iTopPart.PartsEx(0)[0]
iPropertyKeeper = API7.IPropertyKeeper(iPart7)
print iPropertyKeeper.GetPropertyValue(iPropertySect, 0, True)[1]
print iPropertyKeeper.SetPropertyValue(iPropertySect, None, True)
print iPropertyKeeper.GetPropertyValue(iPropertySect, 0, True)[1]

SpacePurr

И правда, сработало.
Очень странно, я и null ставил и все остальное, но при итерации через Parts не срабатывало. А сейчас через PartsEx заработало.
Это конечно пока не отменяет оставшихся проблем с созданием спецификации и прочих, но это огромный прорыв.

Спасибо вам большое. Вы гений.

SpacePurr

Не хочу создавать дополнительную тему, потому что касается все также моего изначального вопроса.
Как с утра сел так и не слазил. Не получается создать внешний объект спецификации у модели.

Использовал ksSpcObjectCreate("", 0, 20, 0, 0, 0); (у объекта типа ksSpecification)
Использовал BaseObjects.Add(20, 0); (у объекта типа SpecificationDescription)

Все добавляется, все появляется в коллекциях базовых объектов.
SpecificationDescriptions.Count = 1 - добавлена строка в описание
BaseObjects.Count = 1 - добавлена таблица спецификации

Если выполню BaseObject[0].Edit() то откроется таблица спецификации, раздел правильный, все как надо(только ячейки не заполнены).
Закрываешь. Пытаешься открыть спецификацию по команде "Внешний объект спецификации" - открывается окно выбора раздела для создания. Хотя вот я только что создал спецификацию.
Тестируем: Жму ок, сохраняю модель.
Иду обратно в код - смотрю количество спецификаций в коллекции - BaseObjects.Count = 2

То есть выходит, что программное создание спецификации создает не внешний объект спецификации, но внешний объект спецификации тем не менее добавляется в туже коллекцию при создании из компаса.
В упор не пойму. И свойства их проверил. Отличий нет. Весь форум перерыл(не весь, тем может быть 100-150). Не могу понять как сделать спецификацию внешней программно.
Читаю справку компаса, там написано что базовый объект спецификации и внешней это одно и тоже, только одно у чертежей, другое у моделей и все в этом духе.

К слову, записал макрос на создание внешнего объекта спецификации с помощью функционала компаса.
Записал макрос на открытие внешнего объекта спецификации отдельно, после создания.
Ни один из макросов при запуске не сработал. Может я чего не понял - по коду похоже на то, что я у себя в студии пишу.

Прошу помощи в этом как оказалось сложном для меня вопросе:
"Как создать внешний объект спецификации у модели?"

Вират Лакх

Сначала переключить режим, потом создавать.
Description = iDocument.SpecificationDescriptions.Active # Текущее описание спецификации
Description.DelegateMode = True # Режим редактирования внешних объектов для описания спецификации сборки
Description.Update() # Изменить описание. Метод устанавливает новые параметры для описания спецификации.

SpacePurr

Спасибо большое.
Попробовал и так и эдак и еще десяток вариантов вокруг да около, но никак.
Единственное что заметил, если выполнить следующие действия:
1. Заполнить созданную программно таблицу спецификации(обозначение, наименование, кол) и ее свойства (масса, обозначение материала) также как заполняется внешний объект спецификации
2. Открыть модель, выполнить команду Внешний объект спецификации, выбрать раздел, откроется таблица спецификации и нажать отмена.
3. Выполнить повторно Внешний объект спецификации

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

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

Спасибо вам большое за помощь, но победить компас у меня не вышло))