Сохранение параметров.

Автор gabik, 12.02.13, 08:56:14

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

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

gabik

Сохраняю параметры в верхнюю сборку:

var part = (ksPart)Kompas.Instance.Document3D.GetPart((short)Part_Type.pTop_Part);
var par = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
var item = (ksLtVariant)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_LtVariant);
var arr = (ksDynamicArray)Kompas.Instance.KompasObject.GetDynamicArray(ldefin2d.LTVARIANT_ARR);

par.Init();
par.SetUserArray(arr);
item.Init();
item.strVal = "Параметры";
arr.ksAddArrayItem(-1, item);

part.SetUserParam(par);
part.Update();


Читаю параметры из верхней сборки:

var part = (ksPart)Kompas.Instance.Document3D.GetPart((short)Part_Type.pTop_Part);
ksUserParam par2 = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
ksLtVariant item2 = (ksLtVariant)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_LtVariant);
ksDynamicArray arr2 = (ksDynamicArray)Kompas.Instance.KompasObject.GetDynamicArray(ldefin2d.LTVARIANT_ARR);

par2.Init();
par2.SetUserArray(arr2);
item2.Init();
item2.strVal = "Нет параметров";
arr2.ksAddArrayItem(-1, item2);

part.GetUserParam(par2);

arr2.ksGetArrayItem(0, item2);

Параметр не читается. В чем может быть проблема? Или в режими деталь нельзя сохранять параметры в верхнюю сборку?

Вы примечание внимательно читали:
- Если пользовательские данные были сохранены через ksUserParam::SetUserArray, то перед их получением нужно создать UserArray, аналогичный по структуре используемому при сохранении, и передать его в ksUserParam::SetUserArray.

Вы массив сначала передаёте, а потом создаёте, тем более уже проходили эти грабли http://forum.ascon.ru/index.php/topic,23680.msg167994.html#msg167994

gabik

Так, ничего не выходит! Вот упростил до элементарного. Две статические функциии, запускаемые из меню библиотеки.
Сохранения параметров:

public static void SaveParam()
{
var part = (ksPart)Kompas.Instance.Document3D.GetPart((short)Part_Type.pTop_Part);
var array = (ksDynamicArray)Kompas.Instance.KompasObject.GetDynamicArray(ldefin2d.LTVARIANT_ARR);
var variant = (ksLtVariant)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_LtVariant);

variant.Init();
variant.intVal = 125;

// Записываем в массив 125.
array.ksAddArrayItem(-1, variant);

// Создаем параметры
var userParam = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
userParam.Init();
// Устанавливаем массив в параметры.
userParam.SetUserArray(array);
// Устанавливаем в деталь параметры.
part.SetUserParam(userParam);
// Обновляем деталь
part.Update();
}


Чтение параметров:

public static void OpenParam()
{
var part = (ksPart)Kompas.Instance.Document3D.GetPart((short)Part_Type.pTop_Part);

// Создаем аналагичную структуру массива
var array = (ksDynamicArray)Kompas.Instance.KompasObject.GetDynamicArray(ldefin2d.LTVARIANT_ARR);
var variant = (ksLtVariant)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_LtVariant);

variant.Init();
variant.intVal = 0;
array.ksAddArrayItem(-1, variant);

// Параметры
var userParam = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
userParam.Init();
// Устанавливаем в параметры аналогичный по структуре массив
userParam.SetUserArray(array);
// Читаем параметры
part.GetUserParam(userParam);

variant.Init();
variant.intVal = 0;
// Пытаемся получить число 125.
array.ksGetArrayItem(0, variant);
Kompas.Instance.KompasObject.ksMessage(variant.intVal.ToString()); // А в ответ всего-лишь 0...
}

Попробуйте получить массив заново после part.GetUserParam(userParam);
array1:=ksUserParam.GetUserArray;
+ Благодарностей: 1

gabik

При сохранении параметров пользовательских в деталь и вызов part.GetUserParamSize() имеет значение 0. Т.е. параметры даже не устанавливаются... Видимо сохранение параметров в деталь невозможно, а сохранение возможно только при использование сборок.

А Вы не пробовали метод part.Update после установки массива или он тоже ничего не даёт?

gabik

#6
Ничего не дает. Да, используя вместо детали сборку, добавляя туда компонент, все работает на ура. Могли бы написать что параметры нельзя устанавливать к главной сборке) где мои 3 часа жизни...
+ Благодарностей: 1

gabik

Сохранять параметры можно через IUserDataStoragesMng. Нот тут у меня возникла проблема: для добавления объекта в хранилище используется функция: long AddObject( LPCTSTR pass, const VARIANT & object, LPCTSTR comment ). Где объект может быть variant'ом с типом VT_INT, VT_I2, VT_I4, VT_R4, VT_R8, VT_DATE, VT_UI1, VT_UINT, VT_BOOL, VT_BSTR, VT_DISPATCH, а также VT_ARRAY с этими типами данных. Я же не имею возможности использовать тип VARIANT...

333

part.SetUserParam только для вставок
Для Top-а нужно использовать IUserDataStoragesMng
+ Благодарностей: 1