914 lines
22 KiB
C
914 lines
22 KiB
C
/**
|
|
* @file GoSurfaceToolUtils.c
|
|
*
|
|
* @internal
|
|
* Copyright (C) 2016-2021 by LMI Technologies Inc.
|
|
* Licensed under the MIT License.
|
|
* Redistributed files must retain the above copyright notice.
|
|
*/
|
|
#include <GoSdk/Tools/GoSurfaceToolUtils.h>
|
|
#include <GoSdk/GoSensor.h>
|
|
|
|
|
|
kBeginClassEx(Go, GoCylinderRegion)
|
|
kEndClassEx()
|
|
|
|
GoFx(kStatus) GoCylinderRegion_Construct(GoCylinderRegion* region, kObject sensor, kAlloc allocator)
|
|
{
|
|
kAlloc alloc = kAlloc_Fallback(allocator);
|
|
kStatus status;
|
|
|
|
kCheck(kAlloc_GetObject(alloc, kTypeOf(GoCylinderRegion), region));
|
|
|
|
if (!kSuccess(status = GoCylinderRegion_Init(*region, kTypeOf(GoCylinderRegion), sensor, alloc)))
|
|
{
|
|
kAlloc_FreeRef(alloc, region);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GoFx(kStatus) GoCylinderRegion_Init(GoCylinderRegion region, kType type, kObject sensor, kAlloc alloc)
|
|
{
|
|
kObjR(GoCylinderRegion, region);
|
|
|
|
kCheck(kObject_Init(region, type, alloc));
|
|
kZero(obj->xml);
|
|
kZero(obj->xmlItem);
|
|
obj->x = 0.0;
|
|
obj->y = 0.0;
|
|
obj->z = 0.0;
|
|
|
|
obj->sensor = sensor;
|
|
|
|
obj->radius = 0.5;
|
|
obj->height = 1.0;
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoCylinderRegion_Read(GoCylinderRegion region, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
kCheck(kXml_Child64f(xml, item, "X", &obj->x));
|
|
kCheck(kXml_Child64f(xml, item, "Y", &obj->y));
|
|
kCheck(kXml_Child64f(xml, item, "Z", &obj->z));
|
|
kCheck(kXml_Child64f(xml, item, "Radius", &obj->radius));
|
|
kCheck(kXml_Child64f(xml, item, "Height", &obj->height));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoCylinderRegion_Write(GoCylinderRegion region, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
kCheck(kXml_SetChild64f(xml, item, "X", obj->x));
|
|
kCheck(kXml_SetChild64f(xml, item, "Y", obj->y));
|
|
kCheck(kXml_SetChild64f(xml, item, "Z", obj->z));
|
|
kCheck(kXml_SetChild64f(xml, item, "Radius", obj->radius));
|
|
kCheck(kXml_SetChild64f(xml, item, "Height", obj->height));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
|
|
GoFx(kStatus) GoCylinderRegion_SetX(GoCylinderRegion region, k64f x)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->x = x;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoCylinderRegion_X(GoCylinderRegion region)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->x;
|
|
}
|
|
|
|
GoFx(kStatus) GoCylinderRegion_SetY(GoCylinderRegion region, k64f y)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->y = y;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoCylinderRegion_Y(GoCylinderRegion region)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->y;
|
|
}
|
|
|
|
GoFx(kStatus) GoCylinderRegion_SetZ(GoCylinderRegion region, k64f z)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->z = z;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoCylinderRegion_Z(GoCylinderRegion region)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->z;
|
|
}
|
|
|
|
GoFx(kStatus) GoCylinderRegion_SetRadius(GoCylinderRegion region, k64f radius)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->radius = radius;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoCylinderRegion_Radius(GoCylinderRegion region)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->radius;
|
|
}
|
|
|
|
GoFx(kStatus) GoCylinderRegion_SetHeight(GoCylinderRegion region, k64f height)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->height = height;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoCylinderRegion_Height(GoCylinderRegion region)
|
|
{
|
|
kObj(GoCylinderRegion, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->height;
|
|
}
|
|
|
|
|
|
kBeginClassEx(Go, GoSurfaceRegion2d)
|
|
kEndClassEx()
|
|
|
|
GoFx(kStatus) GoSurfaceRegion2d_Construct(GoSurfaceRegion2d* region, kObject sensor, kAlloc allocator)
|
|
{
|
|
kAlloc alloc = kAlloc_Fallback(allocator);
|
|
kStatus status;
|
|
|
|
kCheck(kAlloc_GetObject(alloc, kTypeOf(GoSurfaceRegion2d), region));
|
|
|
|
if (!kSuccess(status = GoSurfaceRegion2d_Init(*region, kTypeOf(GoSurfaceRegion2d), sensor, alloc)))
|
|
{
|
|
kAlloc_FreeRef(alloc, region);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceRegion2d_Init(GoSurfaceRegion2d region, kType type, kObject sensor, kAlloc alloc)
|
|
{
|
|
kObjR(GoSurfaceRegion2d, region);
|
|
|
|
kCheck(kObject_Init(region, type, alloc));
|
|
kZero(obj->xml);
|
|
kZero(obj->xmlItem);
|
|
|
|
obj->sensor = sensor;
|
|
|
|
obj->x = 0;
|
|
obj->y = 0;
|
|
obj->width = 1.0;
|
|
obj->length = 1.0;
|
|
obj->zAngle = 0;
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceRegion2d_Read(GoSurfaceRegion2d region, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
kCheck(kXml_Child64f(xml, item, "X", &obj->x));
|
|
kCheck(kXml_Child64f(xml, item, "Y", &obj->y));
|
|
kCheck(kXml_Child64f(xml, item, "Width", &obj->width));
|
|
kCheck(kXml_Child64f(xml, item, "Length", &obj->length));
|
|
if (kXml_ChildExists(xml, item, "ZAngle") == kTRUE)
|
|
{
|
|
kCheck(kXml_Child64f(xml, item, "ZAngle", &obj->zAngle));
|
|
}
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceRegion2d_Write(GoSurfaceRegion2d region, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
kCheck(kXml_SetChild64f(xml, item, "X", obj->x));
|
|
kCheck(kXml_SetChild64f(xml, item, "Y", obj->y));
|
|
kCheck(kXml_SetChild64f(xml, item, "Width", obj->width));
|
|
kCheck(kXml_SetChild64f(xml, item, "Length", obj->length));
|
|
kCheck(kXml_SetChild64f(xml, item, "ZAngle", obj->zAngle));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
|
|
GoFx(kStatus) GoSurfaceRegion2d_SetX(GoSurfaceRegion2d region, k64f x)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->x = x;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoSurfaceRegion2d_X(GoSurfaceRegion2d region)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->x;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceRegion2d_SetY(GoSurfaceRegion2d region, k64f y)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->y = y;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoSurfaceRegion2d_Y(GoSurfaceRegion2d region)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->y;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceRegion2d_SetWidth(GoSurfaceRegion2d region, k64f width)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->width = width;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoSurfaceRegion2d_Width(GoSurfaceRegion2d region)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->width;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceRegion2d_SetLength(GoSurfaceRegion2d region, k64f length)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->length = length;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoSurfaceRegion2d_Length(GoSurfaceRegion2d region)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->length;
|
|
}
|
|
//Added H.Ware
|
|
GoFx(kStatus) GoSurfaceRegion2d_SetZAngle(GoSurfaceRegion2d region, k64f zAngle)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->zAngle = zAngle;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoSurfaceRegion2d_ZAngle(GoSurfaceRegion2d region)
|
|
{
|
|
kObj(GoSurfaceRegion2d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->zAngle;
|
|
}
|
|
|
|
kBeginClassEx(Go, GoRegion3d)
|
|
kEndClassEx()
|
|
|
|
GoFx(kStatus) GoRegion3d_Construct(GoRegion3d* region, kObject sensor, kAlloc allocator)
|
|
{
|
|
kAlloc alloc = kAlloc_Fallback(allocator);
|
|
kStatus status;
|
|
|
|
kCheck(kAlloc_GetObject(alloc, kTypeOf(GoRegion3d), region));
|
|
|
|
if (!kSuccess(status = GoRegion3d_Init(*region, kTypeOf(GoRegion3d), sensor, alloc)))
|
|
{
|
|
kAlloc_FreeRef(alloc, region);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GoFx(kStatus) GoRegion3d_Init(GoRegion3d region, kType type, kObject sensor, kAlloc alloc)
|
|
{
|
|
kObjR(GoRegion3d, region);
|
|
|
|
kCheck(kObject_Init(region, type, alloc));
|
|
kZero(obj->xml);
|
|
kZero(obj->xmlItem);
|
|
obj->x = 0.0;
|
|
obj->y = 0.0;
|
|
obj->z = 0.0;
|
|
|
|
obj->sensor = sensor;
|
|
|
|
obj->width = 1.0;
|
|
obj->height = 1.0;
|
|
obj->length = 1.0;
|
|
|
|
obj->zAngle = 0;
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoRegion3d_Read(GoRegion3d region, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
kXmlItem tempItem = kNULL;
|
|
|
|
kCheck(kXml_Child64f(xml, item, "X", &obj->x));
|
|
kCheck(kXml_Child64f(xml, item, "Y", &obj->y));
|
|
kCheck(kXml_Child64f(xml, item, "Z", &obj->z));
|
|
kCheck(kXml_Child64f(xml, item, "Width", &obj->width));
|
|
kCheck(kXml_Child64f(xml, item, "Length", &obj->length));
|
|
kCheck(kXml_Child64f(xml, item, "Height", &obj->height));
|
|
|
|
tempItem = kXml_Child(xml, item, "ZAngle");
|
|
if (!kIsNull(tempItem))
|
|
{
|
|
if (kXml_AttrExists(xml, tempItem, "used"))
|
|
{
|
|
kBool bUsed = kFALSE;
|
|
kCheck(kXml_AttrBool(xml, tempItem, "used", &bUsed));
|
|
if (bUsed == kTRUE)
|
|
{
|
|
kCheck(kXml_Child64f(xml, item, "ZAngle", &obj->zAngle));
|
|
}
|
|
}
|
|
}
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoRegion3d_Write(GoRegion3d region, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
kCheck(kXml_SetChild64f(xml, item, "X", obj->x));
|
|
kCheck(kXml_SetChild64f(xml, item, "Y", obj->y));
|
|
kCheck(kXml_SetChild64f(xml, item, "Z", obj->z));
|
|
kCheck(kXml_SetChild64f(xml, item, "Width", obj->width));
|
|
kCheck(kXml_SetChild64f(xml, item, "Length", obj->length));
|
|
kCheck(kXml_SetChild64f(xml, item, "Height", obj->height));
|
|
kCheck(kXml_SetChild64f(xml, item, "ZAngle", obj->zAngle));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
|
|
GoFx(kStatus) GoRegion3d_SetX(GoRegion3d region, k64f x)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->x = x;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoRegion3d_X(GoRegion3d region)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->x;
|
|
}
|
|
|
|
GoFx(kStatus) GoRegion3d_SetY(GoRegion3d region, k64f y)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->y = y;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoRegion3d_Y(GoRegion3d region)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->y;
|
|
}
|
|
|
|
GoFx(kStatus) GoRegion3d_SetZ(GoRegion3d region, k64f z)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->z = z;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoRegion3d_Z(GoRegion3d region)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->z;
|
|
}
|
|
|
|
GoFx(kStatus) GoRegion3d_SetWidth(GoRegion3d region, k64f width)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->width = width;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoRegion3d_Width(GoRegion3d region)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->width;
|
|
}
|
|
|
|
GoFx(kStatus) GoRegion3d_SetLength(GoRegion3d region, k64f length)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->length = length;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoRegion3d_Length(GoRegion3d region)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->length;
|
|
}
|
|
|
|
GoFx(kStatus) GoRegion3d_SetHeight(GoRegion3d region, k64f height)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->height = height;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoRegion3d_Height(GoRegion3d region)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->height;
|
|
}
|
|
GoFx(kStatus) GoRegion3d_SetZAngle(GoRegion3d region, k64f zAngle)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->zAngle = zAngle;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(k64f) GoRegion3d_ZAngle(GoRegion3d region)
|
|
{
|
|
kObj(GoRegion3d, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->zAngle;
|
|
}
|
|
|
|
kBeginClassEx(Go, GoSurfaceFeature)
|
|
kAddVMethod(GoSurfaceFeature, kObject, VRelease)
|
|
kEndClassEx()
|
|
|
|
GoFx(kStatus) GoSurfaceFeature_Construct(GoSurfaceFeature* feature, kObject sensor, kAlloc allocator)
|
|
{
|
|
kAlloc alloc = kAlloc_Fallback(allocator);
|
|
kStatus status;
|
|
|
|
kCheck(kAlloc_GetObject(alloc, kTypeOf(GoSurfaceFeature), feature));
|
|
|
|
if (!kSuccess(status = GoSurfaceFeature_Init(*feature, kTypeOf(GoSurfaceFeature), sensor, alloc)))
|
|
{
|
|
kAlloc_FreeRef(alloc, feature);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceFeature_Init(GoSurfaceFeature feature, kType type, kObject sensor, kAlloc alloc)
|
|
{
|
|
kObjR(GoSurfaceFeature, feature);
|
|
kStatus exception;
|
|
|
|
kCheck(kObject_Init(feature, type, alloc));
|
|
kZero(obj->xml);
|
|
kZero(obj->xmlItem);
|
|
obj->type = GO_SURFACE_FEATURE_TYPE_AVERAGE;
|
|
obj->region = kNULL;
|
|
|
|
obj->sensor = sensor;
|
|
obj->regionEnabled = kTRUE;
|
|
|
|
kTry
|
|
{
|
|
kTest(GoRegion3d_Construct(&obj->region, sensor, alloc));
|
|
}
|
|
kCatch(&exception)
|
|
{
|
|
GoSurfaceFeature_VRelease(feature);
|
|
kEndCatch(exception);
|
|
}
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceFeature_VRelease(GoSurfaceFeature feature)
|
|
{
|
|
kObj(GoSurfaceFeature, feature);
|
|
|
|
kCheck(kDestroyRef(&obj->region));
|
|
|
|
return kObject_VRelease(feature);
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceFeature_Read(GoSurfaceFeature feature, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoSurfaceFeature, feature);
|
|
kXmlItem regionItem = kNULL;
|
|
|
|
kCheck(kXml_Child32s(xml, item, "Type", &obj->type));
|
|
kCheck(kXml_ChildBool(xml, item, "RegionEnabled", &obj->regionEnabled));
|
|
|
|
kCheck(!kIsNull(regionItem = kXml_Child(xml, item, "Region")));
|
|
kCheck(GoRegion3d_Read(obj->region, xml, regionItem));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceFeature_Write(GoSurfaceFeature feature, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoSurfaceFeature, feature);
|
|
kXmlItem regionItem = kNULL;
|
|
|
|
kCheck(kXml_SetChild32s(xml, item, "Type", obj->type));
|
|
kCheck(kXml_SetChildBool(xml, item, "RegionEnabled", obj->regionEnabled));
|
|
|
|
kCheck(kXml_AddItem(xml, item, "Region", ®ionItem));
|
|
kCheck(GoRegion3d_Write(obj->region, xml, regionItem));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(GoSurfaceFeatureType) GoSurfaceFeature_Type(GoSurfaceFeature feature)
|
|
{
|
|
kObj(GoSurfaceFeature, feature);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->type;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceFeature_SetType(GoSurfaceFeature feature, GoSurfaceFeatureType type)
|
|
{
|
|
kObj(GoSurfaceFeature, feature);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->type = type;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kBool) GoSurfaceFeature_RegionEnabled(GoSurfaceFeature feature)
|
|
{
|
|
kObj(GoSurfaceFeature, feature);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->regionEnabled;
|
|
}
|
|
|
|
GoFx(kStatus) GoSurfaceFeature_EnableRegion(GoSurfaceFeature feature, kBool enable)
|
|
{
|
|
kObj(GoSurfaceFeature, feature);
|
|
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->regionEnabled = enable;
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(GoRegion3d) GoSurfaceFeature_Region(GoSurfaceFeature feature)
|
|
{
|
|
kObj(GoSurfaceFeature, feature);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return obj->region;
|
|
}
|
|
|
|
kBeginClassEx(Go, GoPointSetRegion)
|
|
kAddVMethod(GoPointSetRegion, kObject, VRelease)
|
|
kEndClassEx()
|
|
|
|
GoFx(kStatus) GoPointSetRegion_Construct(GoPointSetRegion* region, kObject sensor, kAlloc allocator)
|
|
{
|
|
kAlloc alloc = kAlloc_Fallback(allocator);
|
|
kStatus status;
|
|
|
|
kCheck(kAlloc_GetObject(alloc, kTypeOf(GoPointSetRegion), region));
|
|
|
|
if (!kSuccess(status = GoPointSetRegion_Init(*region, kTypeOf(GoPointSetRegion), sensor, alloc)))
|
|
{
|
|
kAlloc_FreeRef(alloc, region);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GoFx(kStatus) GoPointSetRegion_Init(GoPointSetRegion region, kType type, kObject sensor, kAlloc alloc)
|
|
{
|
|
kObjR(GoPointSetRegion, region);
|
|
|
|
kCheck(kObject_Init(region, type, alloc));
|
|
kZero(obj->xml);
|
|
kZero(obj->xmlItem);
|
|
kZero(obj->points);
|
|
|
|
obj->sensor = sensor;
|
|
|
|
obj->constantZ = k64F_NULL;
|
|
kCheck(kArrayList_Construct(&obj->points, kTypeOf(kPoint3d64f), 0, alloc));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoPointSetRegion_VRelease(GoPointSetRegion region)
|
|
{
|
|
kObj(GoPointSetRegion, region);
|
|
|
|
kCheck(kDestroyRef(&obj->points));
|
|
|
|
return kObject_VRelease(region);
|
|
}
|
|
|
|
|
|
GoFx(kStatus) GoPointSetRegion_Read(GoPointSetRegion region, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoPointSetRegion, region);
|
|
kArrayList points = obj->points;
|
|
kXmlItem nextPoint;
|
|
kXmlItem tempItem = kNULL;
|
|
|
|
kCheck(kArrayList_Clear(points));
|
|
|
|
for(nextPoint = kXml_FirstChild(xml, item); nextPoint != kNULL; nextPoint = kXml_NextSibling(xml, nextPoint))
|
|
{
|
|
kPoint3d64f point;
|
|
|
|
kCheck(kXml_Child64f(xml, nextPoint, "X", &point.x));
|
|
kCheck(kXml_Child64f(xml, nextPoint, "Y", &point.y));
|
|
kCheck(kXml_Child64f(xml, nextPoint, "Z", &point.z));
|
|
|
|
kCheck(kArrayList_AddT(points, &point));
|
|
}
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoPointSetRegion_Write(GoPointSetRegion region, kXml xml, kXmlItem item)
|
|
{
|
|
kObj(GoPointSetRegion, region);
|
|
kArrayList points = obj->points;
|
|
kSize pointNum;
|
|
kXmlItem pointItem;
|
|
|
|
if (points != kNULL)
|
|
{
|
|
for (pointNum = 0; pointNum < kArrayList_Count(points); ++pointNum)
|
|
{
|
|
kPoint3d64f point = *kArrayList_AtT(points, pointNum, kPoint3d64f);
|
|
kCheck(kXml_AddItem(xml, item, "Point", &pointItem));
|
|
|
|
kCheck(GoPointSetRegion_WriteCoord(xml, pointItem, "X", point.x, kFALSE));
|
|
kCheck(GoPointSetRegion_WriteCoord(xml, pointItem, "Y", point.y, kFALSE));
|
|
|
|
k64f zValue = obj->constantZ;
|
|
kBool readOnly;
|
|
if (zValue == k64F_NULL)
|
|
{
|
|
readOnly = kFALSE;
|
|
zValue = point.z;
|
|
}
|
|
else
|
|
{
|
|
readOnly = kTRUE;
|
|
zValue = obj->constantZ;
|
|
}
|
|
|
|
kCheck(GoPointSetRegion_WriteCoord(xml, pointItem, "Z", zValue, readOnly));
|
|
}
|
|
}
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoPointSetRegion_WriteCoord(kXml xml, kXmlItem item, kChar *name, k64f value, kBool readOnly)
|
|
{
|
|
kXmlItem coordItem;
|
|
|
|
kCheck(kXml_AddItem(xml, item, name, &coordItem));
|
|
|
|
kCheck(kXml_SetItem64f(xml, coordItem, value));
|
|
kCheck(kXml_SetAttr64f(xml, coordItem, "value", value));
|
|
kCheck(kXml_SetAttrBool(xml, coordItem, "readonly", readOnly));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
|
|
GoFx(kStatus) GoPointSetRegion_DisableConstantZ(GoPointSetRegion region)
|
|
{
|
|
kObj(GoPointSetRegion, region);
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->constantZ = k64F_NULL;
|
|
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kStatus) GoPointSetRegion_SetConstantZ(GoPointSetRegion region, k64f constantZ)
|
|
{
|
|
kObj(GoPointSetRegion, region);
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
obj->constantZ = constantZ;
|
|
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(const kPoint3d64f*) GoPointSetRegion_PointAt(GoPointSetRegion region, kSize index)
|
|
{
|
|
kObj(GoPointSetRegion, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return kArrayList_AtT(obj->points, index, kPoint3d64f);
|
|
}
|
|
|
|
GoFx(kStatus) GoPointSetRegion_SetPointAt(GoPointSetRegion region, kSize index, const kPoint3d64f* point)
|
|
{
|
|
kObj(GoPointSetRegion, region);
|
|
kCheckState(GoSensor_IsConfigurable(obj->sensor));
|
|
kCheck(GoSensor_CacheConfig(obj->sensor));
|
|
|
|
*kArrayList_AtT(obj->points, index, kPoint3d64f) = *point;
|
|
|
|
kCheck(GoSensor_SetConfigModified(obj->sensor));
|
|
|
|
return kOK;
|
|
}
|
|
|
|
GoFx(kSize) GoPointSetRegion_PointCount(GoPointSetRegion region)
|
|
{
|
|
kObj(GoPointSetRegion, region);
|
|
|
|
GoSensor_SyncConfig(obj->sensor);
|
|
|
|
return kArrayList_Count(obj->points);
|
|
}
|