• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

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

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

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

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

gabik

Как правильно организовать панель свойств библиотеки. Мы запускаем библиотеку, и возникает панель свойств, где мы выбираем необходимые действия. В 2D панель вызывается с помощью запроса к системы на получение координат Document2D.ksPlacementEx(). В 3D есть процесс Document3D.UserGetPlacementAndEntity(), но как в нем получить конкретные координаты? В процессе UserGetCursor() нет возможности вызвать панель свойств?

Смотрите IProcessParam - интерфейс параметров процесса и ksRequestInfo3D - интерфейс параметров запроса к системе.
Данный интерфейс позволяет установить параметры процесса указания местоположения точки или объектов (UserGetPlacementAndEntity).

+ Благодарностей: 1

gabik

Создал IProcessParam, с необходимыми кнопками, все отлично. Создал ksRequestInfo3D, в нем указал на параметры. Далее вызываю UserGetPlacementAndEntity(). Появляется моя панель. Как можно получить теперь конкретные координаты (X, Y, Z) нажатия курсора? Есть UserGetCursor(), но он не вызывается, если вызвать его из события нажатия на кнопку панели.

Внимательно посмотрите на методы и свойства ksRequestInfo3D.
+ Благодарностей: 1

PS

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

Обычно это делается в динамической или статической функциях обратной связи.
+ Благодарностей: 1

gabik

Получил координаты с помощью ksRequestInfo3D::GetPlacement() в CallBack функции процесса.

PS

ЦитироватьПолучил координаты с помощью ksRequestInfo3D::GetPlacement() в CallBack функции процесса.
Возможно я не прав, но это не текущие 3D координаты курсора.
Это "Интерфейс локальной системы координат (положение объекта)."

Возможно человеку нужно получить именно точку объекта, которые он фильтрует в CallBack функции.
+ Благодарностей: 1

gabik

По щелчку я получаю либо необходимый мне объект, выделяя его и выполняя с ним необходимые действия, либо если щелчок мыши был не на объекте, я получаю место куда вставляется новый объект.

gabik

23.01.13, 08:30:49 #9 Последнее редактирование: 23.01.13, 10:08:04 от gabik
Не могу создать макроообъект с помощью ksDocument3D::GetEditMacroObject, хотя получаю макрообъект из NewEntity((short)Obj3dType.o3d_MacroObject). В чем может быть проблема?

ksMacro3DDefinition - смотрите методы.
+ Благодарностей: 1

gabik

А есть разница как создавать макрообъект? через ksDocument3D::GetEditMacroObject(таким образом не могу создать) или можно через NewEntity((short)Obj3dType.o3d_MacroObject)?

GetEditMacroObject возвращает указатель на уже существующий редактируемый макроэлемент, нужно через через NewEntity.
ksEntity.Create - Создать.


gabik

Для пользовательского редаектирования я так понял необходимо создать ksUserParam и далее SetUserParam(ksUserParams). Для получения ksUserParam применяется KompasObject::GetParamStruct(short structType). Какую именно использовать structType? Там константы только для 2D документов. И я не очень могу понять каким образом я указываю именно функцию для редактирования...

ko_UserParam
Смотрите ksMacro3DDefinition::SetUserParam
+ Благодарностей: 1

gabik

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

gabik

Никак не могу разобраться с записью пользовательских параметров в 3D макрообъект. Вот сделал элементарнейший пример:
Для начала создаю пользовательские параметры, где создаю массив и записываю в него одно число, пусть 10:

var ksUserParams = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
ksUserParams.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 = 10;
array.ksAddArrayItem(-1, variant);
ksUserParams.SetUserArray(array);

Передаю их в макрообъект:

macro3DDef.SetUserParam(ksUserParams);

Теперь попробую сразу же их прочитать:

var ksUserParamsOut = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);
macro3DDef.GetUserParam(ksUserParamsOut);
ksDynamicArray array2 = (ksDynamicArray) ksUserParamsOut.GetUserArray();

И ничего не читается. array2 девственно пуст...

Где Вы создали массив?
Смотрите CreateArray - создать стандартный или пользовательский динамический массив неопределенной длины.

gabik

Создается массив вот тут:

var array = (ksDynamicArray)Kompas.Instance.KompasObject.GetDynamicArray(ldefin2d.LTVARIANT_ARR);

Дело в том что он создается совершенно нормально, я даже читаю из него необходимые данные. Проблема в том что после передачи его в UserParam, а затем в макрообъект, я не могу его получить из макрообъекта.

24.01.13, 20:41:54 #19 Последнее редактирование: 24.01.13, 20:53:39 от Sabahs
Внимательно почитайте примечание GetUserParam.
- Если пользовательские данные были сохранены через ksUserParam::SetUserArray, то перед их получением нужно создать UserArray, аналогичный по структуре используемому при сохранении.
То есть длина должна быть одинаковая в ниже приведенной строке Вы создали массив нулевой длины, куда Компасу данные писать?
var ksUserParamsOut = (ksUserParam)Kompas.Instance.KompasObject.GetParamStruct((short)StructType2DEnum.ko_UserParam);