/** * @file GoPartModel.c * * @internal * Copyright (C) 2016-2021 by LMI Technologies Inc. * Licensed under the MIT License. * Redistributed files must retain the above copyright notice. */ #include #include #include kBeginClassEx(Go, GoPartModelEdge) kAddVMethod(GoPartModelEdge, kObject, VRelease) kEndClassEx() GoFx(kStatus) GoPartModelEdge_Construct(GoPartModelEdge* partModelEdge, kObject parentModel, kObject sensor, kAlloc allocator) { kAlloc alloc = kAlloc_Fallback(allocator); kStatus status; kCheck(kAlloc_GetObject(alloc, kTypeOf(GoPartModelEdge), partModelEdge)); if (!kSuccess(status = GoPartModelEdge_Init(*partModelEdge, kTypeOf(GoPartModelEdge), parentModel, sensor, alloc))) { kAlloc_FreeRef(alloc, partModelEdge); } return status; } GoFx(kStatus) GoPartModelEdge_Init(GoPartModelEdge partModelEdge, kType type, kObject parentModel, kObject sensor, kAlloc alloc) { kObjR(GoPartModelEdge, partModelEdge); kStatus exception = kOK; kCheck(kObject_Init(partModelEdge, type, alloc)); kZero(obj->xml); kZero(obj->xmlItem); obj->imageType = 0; obj->imageSource = GO_DATA_SOURCE_TOP; kZero(obj->removedPoints); obj->partModelParent = parentModel; obj->sensor = sensor; kTry { kTest(kArrayList_Construct(&obj->removedPoints, kTypeOf(k32u), 0, alloc)); } kCatch(&exception) { GoPartModelEdge_VRelease(partModelEdge); kEndCatch(exception); } return kOK; } GoFx(kStatus) GoPartModelEdge_VRelease(GoPartModelEdge partModelEdge) { kObj(GoPartModelEdge, partModelEdge); kDisposeRef(&obj->removedPoints); return kObject_VRelease(partModelEdge); } GoFx(kStatus) GoPartModelEdge_Read(GoPartModelEdge modelEdge, kXml xml, kXmlItem item) { kObj(GoPartModelEdge, modelEdge); kXmlItem enabledItem = kNULL; kXmlItem tempItem = kNULL; kXmlItem tempItemInner = kNULL; kString tempStr = kNULL; obj->xml = xml; obj->xmlItem = item; kTry { kTest(kString_Construct(&tempStr, kNULL, kObject_Alloc(modelEdge))); kTest(kXml_Child32s(xml, item, "ImageType", &obj->imageType)); kTest(kXml_Child32s(xml, item, "ImageSource", &obj->imageSource)); kTest(kXml_ChildString(xml, item, "RemovedPoints", tempStr)); kTest(GoOptionList_ParseList32u(kString_Chars(tempStr), obj->removedPoints)); } kFinally { kDestroyRef(&tempStr); kEndFinally(); } return kOK; } GoFx(kStatus) GoPartModelEdge_Write(GoPartModelEdge partModelEdge, kXml xml, kXmlItem item) { kObj(GoPartModelEdge, partModelEdge); kXmlItem tempItem = kNULL; kXmlItem tempItemInner = kNULL; kString tempStr = kNULL; kTry { kTest(kString_Construct(&tempStr, kNULL, kObject_Alloc(partModelEdge))); kTest(GoOptionList_Format32uString( kArrayList_DataT(obj->removedPoints, k32u), kArrayList_Count(obj->removedPoints), tempStr)); kTest(kXml_SetChildText(xml, item, "RemovedPoints", kString_Chars(tempStr))); //Forwards Compatibility kTest(GoUtils_XmlMerge(obj->xml, obj->xmlItem, xml, item)); } kFinally { kDestroyRef(&tempStr); kEndFinally(); } return kOK; } GoFx(GoImageType) GoPartModelEdge_ImageType(GoPartModelEdge edge) { kObj(GoPartModelEdge, edge); kCheck(GoSensor_SyncPartModels(obj->sensor)); return obj->imageType; } GoFx(GoDataSource) GoPartModelEdge_ImageSource(GoPartModelEdge edge) { kObj(GoPartModelEdge, edge); kCheck(GoSensor_SyncPartModels(obj->sensor)); return obj->imageSource; } GoFx(kStatus) GoPartModelEdge_SetRemovedPoints(GoPartModelEdge edge, const k32u* points, kSize length) { kObj(GoPartModelEdge, edge); kSize i; kCheck(kArrayList_Purge(obj->removedPoints)); for (i = 0; i < length; i++) { kCheck(kArrayList_AddT(obj->removedPoints, &points[i])); } kCheck(GoPartModel_SetModified(obj->partModelParent)); return kOK; } GoFx(kStatus) GoPartModelEdge_RemovedPoints(GoPartModelEdge edge, const k32u* points, kSize* length) { kObj(GoPartModelEdge, edge); GoSensor_SyncPartModels(obj->sensor); points = kArrayList_DataT(obj->removedPoints, k32u); *length = kArrayList_Count(obj->removedPoints); return kOK; } GoFx(kSize) GoPartModelEdge_RemovedPointsLength(GoPartModelEdge edge) { kObj(GoPartModelEdge, edge); GoSensor_SyncPartModels(obj->sensor); return kArrayList_Count(obj->removedPoints); } GoFx(k32u) GoPartModelEdge_RemovedPointAt(GoPartModelEdge edge, kSize index) { kObj(GoPartModelEdge, edge); GoSensor_SyncPartModels(obj->sensor); kAssert(index < GoPartModelEdge_RemovedPointsLength(edge)); return *kArrayList_AtT(obj->removedPoints, index, k32u); } kBeginClassEx(Go, GoPartModel) kAddVMethod(GoPartModel, kObject, VRelease) kEndClassEx() GoFx(kStatus) GoPartModel_Construct(GoPartModel* partModel, kObject sensor, const kChar* name, kAlloc allocator) { kAlloc alloc = kAlloc_Fallback(allocator); kStatus status; kCheck(kAlloc_GetObject(alloc, kTypeOf(GoPartModel), partModel)); if (!kSuccess(status = GoPartModel_Init(*partModel, kTypeOf(GoPartModel), sensor, name, alloc))) { kAlloc_FreeRef(alloc, partModel); } return status; } GoFx(kStatus) GoPartModel_Init(GoPartModel partModel, kType type, kObject sensor, const kChar* name, kAlloc alloc) { kObjR(GoPartModel, partModel); kStatus exception = kOK; kCheck(kObject_Init(partModel, type, alloc)); kZero(obj->sensor); kZero(obj->xml); kZero(obj->xmlItem); obj->name[0] = 0; kZero(obj->edges); obj->transformedDataRegion = kNULL; obj->imageType = 0; kZero(obj->imageTypeOptions); obj->targetEdgeSensitivity = 0.0; obj->edgeSensitivity = 0.0; obj->zAngle = 0.0; obj->isValid = kFALSE; obj->isModified = kFALSE; kCheck(kStrCopy(obj->name, 64, name)); obj->sensor = sensor; kTry { kTest(kArrayList_Construct(&obj->edges, kTypeOf(GoPartModelEdge), 0, alloc)); kTest(kArrayList_Construct(&obj->imageTypeOptions, kTypeOf(k32s), 0, alloc)); kTest(GoRegion3d_Construct(&obj->transformedDataRegion, sensor, alloc)); } kCatch(&exception) { GoPartModel_VRelease(partModel); kEndCatch(exception); } return kOK; } GoFx(kStatus) GoPartModel_VRelease(GoPartModel partModel) { kObj(GoPartModel, partModel); kDestroyRef(&obj->xml); kDestroyRef(&obj->transformedDataRegion); kDisposeRef(&obj->edges); kDestroyRef(&obj->imageTypeOptions); return kObject_VRelease(partModel); } GoFx(kStatus) GoPartModel_Read(GoPartModel model, kXml xml, kXmlItem item) { kObj(GoPartModel, model); kXmlItem tempItem = kNULL; kSize i; kText256 tempText; kObjN(GoRegion3d, region, obj->transformedDataRegion); kStatus exception = kOK; GoPartModelEdge constructedModelEdge = kNULL; kCheck(kDestroyRef(&obj->xml)); obj->xml = xml; obj->xmlItem = item; tempItem = kXml_Child(xml, item, "Edges"); if (!kIsNull(tempItem)) { kTry { for (i = 0; i < kXml_ChildCount(xml, tempItem); i++) { kXmlItem tempItemInner = kXml_ChildAt(xml, tempItem, i); GoPartModelEdge modelEdge; if (kArrayList_Count(obj->edges) <= i) { kTest(GoPartModelEdge_Construct(&constructedModelEdge, model, obj->sensor, kObject_Alloc(model))); modelEdge = constructedModelEdge; kTest(kArrayList_AddT(obj->edges, &constructedModelEdge)); constructedModelEdge = kNULL; } else { modelEdge = *kArrayList_AtT(obj->edges, i, GoPartModelEdge); } kTestArgs(strcmp("Edge", kXml_ItemName(xml, tempItemInner)) == 0); kTest(GoPartModelEdge_Read(modelEdge, xml, tempItemInner)); } } kCatch(&exception) { kDestroyRef(&constructedModelEdge); kEndCatch(exception); } } kCheck(kXml_Child64f(xml, item, "TransformedDataRegion/X", ®ion->x)); kCheck(kXml_Child64f(xml, item, "TransformedDataRegion/Y", ®ion->y)); kCheck(kXml_Child64f(xml, item, "TransformedDataRegion/Z", ®ion->z)); kCheck(kXml_Child64f(xml, item, "TransformedDataRegion/Width", ®ion->width)); kCheck(kXml_Child64f(xml, item, "TransformedDataRegion/Length", ®ion->length)); kCheck(kXml_Child64f(xml, item, "TransformedDataRegion/Height", ®ion->height)); kCheckArgs(!kIsNull(tempItem = kXml_Child(xml, item, "ImageType"))); kCheck(kXml_AttrText(xml, tempItem, "options", tempText, kCountOf(tempText))); kCheck(GoOptionList_ParseList32u(tempText, obj->imageTypeOptions)); kCheck(kXml_Item32s(xml, tempItem, &obj->imageType)); kCheck(kXml_Child64f(xml, item, "TargetEdgeSensitivity", &obj->targetEdgeSensitivity)); kCheck(kXml_Child64f(xml, item, "EdgeSensitivity", &obj->edgeSensitivity)); kCheck(kXml_Child64f(xml, item, "ZAngle", &obj->zAngle)); obj->isModified = kFALSE; obj->isValid = kTRUE; return kOK; } GoFx(kStatus) GoPartModel_Write(GoPartModel partModel, kXml xml, kXmlItem item) { kObj(GoPartModel, partModel); kXmlItem tempItem = kNULL; kXmlItem tempItemInner = kNULL; kSize i; kCheck(kXml_AddItem(xml, item, "Edges", &tempItem)); for (i = 0; i < GoPartModel_EdgeCount(partModel); i++) { kCheck(kXml_AddItem(xml, tempItem, "Edge", &tempItemInner)); kCheck(GoPartModelEdge_Write(GoPartModel_EdgeAt(partModel, i), xml, tempItemInner)); } kCheck(kXml_SetChild32s(xml, item, "ImageType", obj->imageType)); kCheck(kXml_SetChild64f(xml, item, "TargetEdgeSensitivity", obj->targetEdgeSensitivity)); kCheck(kXml_SetChild64f(xml, item, "EdgeSensitivity", obj->edgeSensitivity)); kCheck(kXml_SetChild64f(xml, item, "ZAngle", obj->zAngle)); //Forwards Compatibility kCheck(GoUtils_XmlMerge(obj->xml, obj->xmlItem, xml, item)); return kOK; } GoFx(const kChar*) GoPartModel_Name(GoPartModel model) { kObj(GoPartModel, model); return obj->name; } GoFx(kSize) GoPartModel_EdgeCount(GoPartModel model) { kObj(GoPartModel, model); GoSensor_SyncPartModels(obj->sensor); return kArrayList_Count(obj->edges); } GoFx(GoPartModelEdge) GoPartModel_EdgeAt(GoPartModel model, kSize index) { kObj(GoPartModel, model); GoSensor_SyncPartModels(obj->sensor); kAssert(index < GoPartModel_EdgeCount(model)); return *kArrayList_AtT(obj->edges, index, GoPartModelEdge); } GoFx(k64f) GoPartModel_TransformedDataRegionX(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return GoRegion3d_X(obj->transformedDataRegion); } GoFx(k64f) GoPartModel_TransformedDataRegionY(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return GoRegion3d_Y(obj->transformedDataRegion); } GoFx(k64f) GoPartModel_TransformedDataRegionZ(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return GoRegion3d_Z(obj->transformedDataRegion); } GoFx(k64f) GoPartModel_TransformedDataRegionWidth(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return GoRegion3d_Width(obj->transformedDataRegion); } GoFx(k64f) GoPartModel_TransformedDataRegionLength(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return GoRegion3d_Length(obj->transformedDataRegion); } GoFx(k64f) GoPartModel_TransformedDataRegionHeight(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return GoRegion3d_Height(obj->transformedDataRegion); } GoFx(GoImageType) GoPartModel_ImageType(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return obj->imageType; } GoFx(kStatus) GoPartModel_SetImageType(GoPartModel partModel, GoImageType value) { kObj(GoPartModel, partModel); obj->imageType = value; kCheck(GoPartModel_SetModified(partModel)); return kOK; } GoFx(GoImageType) GoPartModel_ImageTypeOptionAt(GoPartModel partModel, kSize index) { kObj(GoPartModel, partModel); kCheckArgs(index < kArrayList_Count(obj->imageTypeOptions)); return *kArrayList_AtT(obj->imageTypeOptions, index, GoImageType); } GoFx(kSize) GoPartModel_ImageTypeOptionCount(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return kArrayList_Count(obj->imageTypeOptions); } GoFx(k64f) GoPartModel_TargetEdgeSensitivity(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return obj->targetEdgeSensitivity; } GoFx(kStatus) GoPartModel_SetTargetEdgeSensitivity(GoPartModel partModel, k64f value) { kObj(GoPartModel, partModel); obj->targetEdgeSensitivity = value; kCheck(GoPartModel_SetModified(partModel)); return kOK; } GoFx(k64f) GoPartModel_EdgeSensitivity(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return obj->edgeSensitivity; } GoFx(k64f) GoPartModel_ZAngle(GoPartModel partModel) { kObj(GoPartModel, partModel); GoSensor_SyncPartModels(obj->sensor); return obj->zAngle; } GoFx(kStatus) GoPartModel_SetZAngle(GoPartModel partModel, k64f value) { kObj(GoPartModel, partModel); obj->zAngle = value; kCheck(GoPartModel_SetModified(partModel)); return kOK; } GoFx(kStatus) GoPartModel_SetModified(GoPartModel partModel) { kObj(GoPartModel, partModel); obj->isModified = kTRUE; return kOK; } GoFx(kBool) GoPartModel_IsModified(GoPartModel partModel) { kObj(GoPartModel, partModel); return obj->isModified; } GoFx(kBool) GoPartModel_IsValid(GoPartModel partModel) { kObj(GoPartModel, partModel); return obj->isValid; }