Создание / чтение атрибутов у компонентов сборки

Автор maskedball, 18.11.21, 10:00:36

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

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

maskedball

Добрый день.
Подскажите пожалуйста, как создавать и читать атрибуты у компонентов сборки?
Скажем, есть сборка, в которую вставлено 3 вхождения одной и той же детали. Как каждому из этих трех вхождений назначить атрибут с нужным мне именем, типом (строка например) и значением?

maskedball

Вот что у меня получается на сейчашний момент:

var document = (IKompasDocument3D)app.ActiveDocument; // получаю ссылку на документ

var parts = document.TopPart.Parts
 .OfType<IPart7>()
 .ToList(); // коллекция всех компонентов сборки

foreach (var part in parts)
{
 var attribute = document.CreateAttrEx(351543694981, null, part, part.Part); // каждому компоненту создаю атрибут, в качестве уникального номера типа указываю номер строкового типа, который я создал через пользовательский интерфейс
}

KrissKross


maskedball

Цитата: KrissKross от 18.11.21, 11:04:47Непонятно в чем вопрос?

В данный момент проблема в том, что бы корректно создать новый тип атрибута в документе.

maskedball

18.11.21, 15:17:26 #4 Последнее редактирование: 18.11.21, 15:29:27 от maskedball
Для создания нового типа атрибута (на базе которого я потом смогу создавать атрибуты для нужных мне объектов) я написал функцию:

private static double CreateAttributeType(_Application app, string typeName)
{
var manager = (IAttrTypeMng)app; // менеджер атрибутов
var type = manager.CreateAttrType(null); // создаю новый тип, null указывает на то что я использую для хранения типа текущий сеанс приложения (может ошибка тут?)
type.AttrType = ksAttributeTypeEnum.ksATString; // тип - строка
type.TypeName = typeName;  // имя для нового типа

type.Update(String.Empty); // обновляю созданный атрибут (если обновление не выполнить он не появляется в пользовательском интерфейсе)

return type.UniqueNumb;
}

После того как эта функция срабатывает, новый тип атрибута создается.
Проблема в том, что если выбрать этот товый тип в пользовательском интерфейсе для создания нового атрибута - Компас зависает.
Программно так же не получается использовать этот тип для создания атрибута - выскакивает исключение.
Очевидно что я как-то не корректно создаю новый тип атрибута....

maskedball

18.11.21, 17:15:20 #5 Последнее редактирование: 18.11.21, 17:27:20 от maskedball
Разобрался.  :)
Вот моё решение:

private static IAttributeType CreateAttributeType(_Application app, string typeName) // функция возвращающая тип атрибута
{
var manager = (IAttrTypeMng)app; // менеджер типов атрибутов

object[] types = manager.GetAttrTypes(null); // получаем все типы

var type = types?
.OfType<IAttributeType>()
.FirstOrDefault(t => t.TypeName.Equals(typeName));

if (type is not null) // проверяем нет ли типа с искомым именем, если есть - возвращаем его
return type;

type = manager.CreateAttrType(null); // создаем новый тип
type.AttrType = ksAttributeTypeEnum.ksATFixedTable;
type.TypeName = typeName; // имя типа

var column = type.ColumnInfo[0]; // переопределяем первую созданную по дефолту колонку
column.Caption = "Id";
column.ColType = ksValueTypeEnum.ksValueTypeString; // тип колонки - строка
column.DefValue = Guid.Empty.ToString(); // дефолтовое значение
column.Key = 0;
column.Range = 36;
column.ListValue = false;
column.SortListValue = false;

type.Update(null); // вызываем update чтобы создать новый тип

return type; // возвращаем
}

private static void SetAttributeValue(IKompasDocument3D document, IPart7 part, IAttributeType type, string value) // создание атрибута для компонента сборка
{
object[] attributes = document.AttributesEx[0, 0, 0, 0, type.UniqueNumb, part, part.Part];
if (attributes is not null) // проверка не создан ли ранее подобный атрибут
return;

var attribute = document.CreateAttrEx(type.UniqueNumb, null, part, part.Part); // создаем новый атрибут для компонента
attribute.SetValue(null, 0, 0, value); // устанавливаем значение
}

private static string GetAttributeValue(IKompasDocument3D document, IPart7 part, IAttributeType type) // функция достающая из атрибута строковое значение
{
var attribute = ((object[])document.AttributesEx[0, 0, 0, 0, type.UniqueNumb, part, part.Part])
.OfType<IAttribute>()
.FirstOrDefault();

return attribute != null
? (string)attribute.Value[0, 0].ToString()
: String.Empty;
}

Может кому-нибудь пригодится.
+ Благодарностей: 2