Панель свойств в 3D

Автор gabik, 20.01.13, 13:56:13

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

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

gabik

Это я создал параметры для чтения
var ksUserParamsOut = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);

Если судить этому очень странному замечанию, то мне нужно сначала создать массив, а потом его сверху перезаписать функцией (ksDynamicArray) ksUserParamsOut.GetUserArray()? это совсем глупость какая-то получается...
Проверил типы массивов на выходе и входе - сходятся:

ksMessage(array2.ksGetArrayType().ToString());
ksMessage(array.ksGetArrayType().ToString());

24.01.13, 21:05:47 #21 Последнее редактирование: 24.01.13, 21:35:17 от Sabahs
Для начала попробуйте создать массив заполненный нулями идентичной длины и в него прочитать.

gabik

Так процесс чтения заключается в том что ksUserParam::GetUserArray() А у него в свою очередь возвращаемое значение:

указатель на интерфейс динамического массива ksDynamicArray типа LTVARIANT_ARR. Смысл создавать массив, если он полностью будет заменен на другой указатель.




ksDynamicArray array2 = (ksDynamicArray) ksUserParamsOut.GetUserArray();
А разве array2.ksGetArrayItem(0,variant); не возвращает значение из полученного массива.

gabik

Возвращает, но перед тем как вернуть нужно получить сам массив из параметров макрообъекта с помощью функции  ksUserParam::GetUserArray(). А эта функция всегда возвращает пустой массив... Хотя исходный массив 100% создается. Видно что-то не так делаю при чтении массива из параметров. Причем запись и чтение из массива без хранения его (массива) в параметрах макрообъекта проходят на ура

Попробуйте так.
var ksUserParamsOut = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
var array = (ksDynamicArray)Kompas.Instance.KompasObject.GetDynamicArray(ldefin2d.LTVARIANT_ARR);
var variant = (ksLtVariant)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_LtVariant);
variant.Init();
variant.doubleVal = 0;
array.ksAddArrayItem(-1, variant);
ksUserParamsOut.SetUserArray(array);
macro3DDef.GetUserParam(ksUserParamsOut);
ksDynamicArray array2 = (ksDynamicArray) ksUserParamsOut.GetUserArray();
array2.ksGetArrayItem(0,variant);
+ Благодарностей: 1

gabik

Да, заработало. Весьма запутанная система. Во-первых, сначала нужно создать макрообъект командой Create(), а затем уже прикреплять к объекту параметры. Во-вторых, при чтении параметров из макрообъектов, необходимо создание идентичного ksUserParam, с идентичным внутренним массивом параметров.
Таким образом, при создании макрообъекта:

// Создаем макрообъект
_macroObject.Create();
// Создаем параметры объекта для записи.
macroParam = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
macroParam.Init();
// Массив для сохранения пользовательских данных.
var array = (ksDynamicArray)Kompas.Instance.KompasObject.GetDynamicArray(ldefin2d.LTVARIANT_ARR);
var variant = (ksLtVariant)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_LtVariant);
variant.Init();
variant.doubleVal = _rodParam.Height;
array.ksAddArrayItem(-1, variant);
// Устанавлиаем массив в параметры
macroParam.SetUserArray(array);
// Записываем параметры в макрообъект
macro3DDef.SetUserParam(_macroParam);

Далее, при чтении параметров из макрообъекта:

// Создаем параметры макрообъекта для чтения.
macroParam = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
macroParam.Init();
// Создаем массив пользовательских параметров (Обязательно должен быть идентична массиву при записи)
var array = (ksDynamicArray)Kompas.Instance.KompasObject.GetDynamicArray(ldefin2d.LTVARIANT_ARR);
var variant2 = (ksLtVariant)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_LtVariant);
variant2.Init();
variant2.doubleVal = 0;
array.ksAddArrayItem(-1, variant2);
// Устанавливаем массив в макропараметры
_macroParam.SetUserArray(array);
// И только теперь читаем параметры из макрообъекта
macro3DDefinition.GetUserParam(_macroParam);
// После чего получаем доступ к необходимым данным
array.ksGetArrayItem(0, variant2);

gabik

Цитата: PS от 20.01.13, 15:41:30
Координаты XYZ в любой момент можно получить так:
POINT point;
point.x = point.y = 0;
::GetCursorPos( &point );
::ScreenToClient( ( HWND )IDocumentFrame::GetHWND(), &point );
IDocumentFrame::ConvertCoordinates(....)

Обычно это делается в динамической или статической функциях обратной связи.
А вот теперь мне понадобились текущие координаты мыши. Для создания фантома 3D макрообъекта в процессе его вставки. Можно чуть поподробней? Что за функции GetCursorPos, ScreenToClient? В SDK  ничего о них не нашел. Как это можно реализовать в Automation? ksRequestInfo3D::GetPlacement фиксирует положение только после клика.

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

gabik

Ну я собираюсь фантом рисовать в SetFilterCallBack, установив DynamicFiltering = true, т.е. конкретно в этой функции брать мой макрообъект, менять его параметры, перерисовывать. И для осуществления этого гениального плана осталось только ловить координаты мыши в любой момент времени...

PS

Посмотрите сначала IDocumentFrame::ConvertCoordinates - она возвращает координаты мыши которые Вам нужны. На входе этой функции нужны координаты курсора в оконных координатах, их можно получить функцией API Windows  - ::GetCursorPos( &point ), но она возвращает положение курсора мыши в экранных координатах, что бы преобразовать в координаты окна документа используется функция API Windows - ::ScreenToClient( ( HWND )IDocumentFrame::GetHWND(), &point );
+ Благодарностей: 2