From 4e1d94814358eb0dcce72500aac777cd4a4b07f2 Mon Sep 17 00:00:00 2001 From: Maarten Hilferink Date: Wed, 5 Apr 2023 16:12:49 +0200 Subject: [PATCH] https://github.com/ObjectVision/GeoDMS/issues/199#issuecomment-1497094732 implemented, except that the regular variant of TiledUnit has not been depreciated. --- clc/dll/include/CastedUnaryAttrOper.h | 12 ++++++------ clc/dll/src1/Overlay.cpp | 9 +++++---- clc/dll/src1/Subset.cpp | 10 ++++++---- clc/dll/src1/Union.cpp | 3 ++- clc/dll/src1/Unique.cpp | 7 ++++--- clc/dll/src1/UnitCreators.cpp | 2 +- clc/dll/src2/OperPropValue.cpp | 2 ++ clc/dll/src2/OperUnit.cpp | 20 +++++++++++++------- geo/dll/src/BoostPolygon.cpp | 4 ++++ geo/dll/src/Dijkstra.cpp | 2 ++ geo/dll/src/OperDistrict.cpp | 6 ++++-- geo/dll/src/OperPolygon.cpp | 14 +++++++++----- tic/dll/src/Xml/XmlTreeOut.cpp | 5 +++++ 13 files changed, 63 insertions(+), 33 deletions(-) diff --git a/clc/dll/include/CastedUnaryAttrOper.h b/clc/dll/include/CastedUnaryAttrOper.h index ab61ab1cb..7ed66a49f 100644 --- a/clc/dll/include/CastedUnaryAttrOper.h +++ b/clc/dll/include/CastedUnaryAttrOper.h @@ -63,12 +63,12 @@ class AbstrCastedUnaryAttrOperator : public BinaryOperator const AbstrUnit* argUnitA= AsUnit(args[m_ReverseArgs ? 0 : 1]); if (!resultHolder) - resultHolder = CreateCacheDataItem( - argDataA->GetAbstrDomainUnit() - , argUnitA - , m_VC - ); - + { + resultHolder = CreateCacheDataItem(argDataA->GetAbstrDomainUnit(), argUnitA, m_VC); + if (argUnitA->GetTSF(TSF_Categorical)) + resultHolder->SetTSF(TSF_Categorical); + } + if (mustCalc) { AbstrDataItem* res = AsDataItem(resultHolder.GetNew()); diff --git a/clc/dll/src1/Overlay.cpp b/clc/dll/src1/Overlay.cpp index 92ccb5a7a..217fb7dd8 100644 --- a/clc/dll/src1/Overlay.cpp +++ b/clc/dll/src1/Overlay.cpp @@ -300,7 +300,6 @@ void DoOverlay(AbstrDataItem* resAtomicRegionGrid, IterRangeregion relation const overlay_partitioning_info_t* pPtr = partitioningInfo.begin(); @@ -368,7 +367,9 @@ class OverlayOperator : public TernaryOperator MG_CHECK(p < 256); AbstrUnit* resAtomicRegions = Unit::GetStaticClass()->CreateResultUnit(resultHolder); - dbg_assert(resAtomicRegions); + assert(resAtomicRegions); + resAtomicRegions->SetTSF(TSF_Categorical); + resultHolder = resAtomicRegions; AbstrDataItem* resAtomicRegionGrid = CreateDataItem(resAtomicRegions, t_UnionData, gridDomain, resAtomicRegions); @@ -379,7 +380,7 @@ class OverlayOperator : public TernaryOperator DataReadLock ggPartNamesLock(ggPartNamesA); const DataArray* ggPartNames = const_array_cast(ggPartNamesA); - dms_assert(ggPartNames); + assert(ggPartNames); for (UInt32 j = 0; j != p; ++j) { @@ -392,7 +393,7 @@ class OverlayOperator : public TernaryOperator if (!partitioningTI) throwErrorF("Overlay", "%s not found in %s", partNameID.GetStr().c_str(), GetItem(args[2])->GetSourceName().c_str()); const AbstrDataItem* partitioningDI = AsCheckedDataItem(partitioningTI); - dms_assert(partitioningDI); + assert(partitioningDI); AbstrDataItem* resPartitionRel = CreateDataItem( diff --git a/clc/dll/src1/Subset.cpp b/clc/dll/src1/Subset.cpp index a25ac1943..da7096755 100644 --- a/clc/dll/src1/Subset.cpp +++ b/clc/dll/src1/Subset.cpp @@ -150,7 +150,9 @@ struct SubsetOperator: public UnaryOperator resDomainCls = UnitClass::Find(vc->GetCrdClass()); AbstrUnit* res = resDomainCls->CreateResultUnit(resultHolder); - dms_assert(res); + assert(res); + res->SetTSF(TSF_Categorical); + resultHolder = res; AbstrDataItem* resSub = nullptr; @@ -337,9 +339,9 @@ struct AbstrCollectByCondOperator : TernaryOperator { dms_assert(args.size() == 3); - const AbstrUnit* subset = debug_cast(args[0]); - const AbstrDataItem* condA = debug_cast(args[1]); - const AbstrDataItem* dataA = debug_cast(args[2]); + const AbstrUnit* subset = AsUnit(args[0]); + const AbstrDataItem* condA = AsDataItem(args[1]); + const AbstrDataItem* dataA = AsDataItem(args[2]); condA->GetAbstrDomainUnit()->UnifyDomain(dataA->GetAbstrDomainUnit(), "e1", "e2", UM_Throw); if (!resultHolder) diff --git a/clc/dll/src1/Union.cpp b/clc/dll/src1/Union.cpp index bb5a83aa1..b0986aad5 100644 --- a/clc/dll/src1/Union.cpp +++ b/clc/dll/src1/Union.cpp @@ -276,7 +276,8 @@ class UnionDataOperator : public BinaryOperator // extra args are allowed if (!hadToTryWithoutCategoricalCheck) for (arg_index i = 1; i <= n; ++i) { - if (AsDataItem(args[i])->GetTSF(TSF_Categorical)) + auto adi = AsDataItem(args[i]); assert(adi); + if (adi->GetTSF(TSF_Categorical)) isCategorical = true; Unify(vc, AsDataItem(args[i])->GetValueComposition()); } diff --git a/clc/dll/src1/Unique.cpp b/clc/dll/src1/Unique.cpp index 07ecc173b..4e14c71ac 100644 --- a/clc/dll/src1/Unique.cpp +++ b/clc/dll/src1/Unique.cpp @@ -243,17 +243,18 @@ class AbstrUniqueOperator : public UnaryOperator bool CreateResult(TreeItemDualRef& resultHolder, const ArgSeqType& args, bool mustCalc) const override { - dms_assert(args.size() == 1); + assert(args.size() == 1); const AbstrDataItem* arg1 = debug_cast(args[0]); - dms_assert(arg1); + assert(arg1); const AbstrUnit* arg1Values = arg1->GetAbstrValuesUnit(); const ValueClass* vc = arg1->GetAbstrDomainUnit()->GetUnitClass()->GetValueType(); const UnitClass* resDomainCls = UnitClass::Find(vc->GetCrdClass()); AbstrUnit* res = resDomainCls->CreateResultUnit(resultHolder); - dms_assert(res); + assert(res); + res->SetTSF(TSF_Categorical); resultHolder = res; AbstrDataItem* resSub = CreateDataItem(res, s_Values, res, arg1Values, arg1->GetValueComposition() ); diff --git a/clc/dll/src1/UnitCreators.cpp b/clc/dll/src1/UnitCreators.cpp index 7695ea3b7..03a54ae53 100644 --- a/clc/dll/src1/UnitCreators.cpp +++ b/clc/dll/src1/UnitCreators.cpp @@ -145,7 +145,7 @@ ConstUnitRef compatible_values_unit_creator_func(arg_index nrSkippedArgs, const { auto adi = AsDataItem(args[cat_unit_index]); auto avu = AbstrValuesUnit(adi); - if (avu && (adi->GetTSF(TSF_Categorical) || avu->GetTSF(TSF_Categorical))) + if (avu && adi->GetTSF(TSF_Categorical)) { catUnit = avu; break; diff --git a/clc/dll/src2/OperPropValue.cpp b/clc/dll/src2/OperPropValue.cpp index b575ff354..7eee6cb12 100644 --- a/clc/dll/src2/OperPropValue.cpp +++ b/clc/dll/src2/OperPropValue.cpp @@ -178,6 +178,8 @@ struct PropValueOperator : public BinaryOperator if (m_ItemSetProvider) { resultHolder = Unit::GetStaticClass()->CreateResultUnit(resultHolder); // count subitems. + resultHolder->SetTSF(TSF_Categorical); + resultHolder.GetNew()->SetKeepDataState(true); for (SizeT p=0, pe = argDomain->GetCount(); p!=pe; ++p) AbstrDataItem* resAttr = CreateDataItem( diff --git a/clc/dll/src2/OperUnit.cpp b/clc/dll/src2/OperUnit.cpp index e5fc60060..69f613cfa 100644 --- a/clc/dll/src2/OperUnit.cpp +++ b/clc/dll/src2/OperUnit.cpp @@ -220,11 +220,13 @@ class UnitCombineOperator : public NullaryOperator { if (!resultHolder) { - dms_assert(!mustCalc); + assert(!mustCalc); resultHolder = ResultType::GetStaticClass()->CreateResultUnit(resultHolder); } auto resUnit = AsUnit(resultHolder.GetNew()); - dms_assert(resUnit); + assert(resUnit); + resUnit->SetTSF(TSF_Categorical); + return UnitCombine_impl(resUnit, args, mustCalc, m_MustCreateBackRefs); } }; @@ -965,9 +967,11 @@ struct AbstrTiledUnitOper: BinaryOperator if (!resultHolder) { - dms_assert(!mustCalc); + assert(!mustCalc); AbstrUnit* result = debug_cast(GetResultClass())->CreateResultUnit(resultHolder); - dms_assert(result); + assert(result); + result->SetTSF(TSF_Categorical); + resultHolder = result; result->DuplFrom(a1->GetAbstrValuesUnit()); } @@ -1034,16 +1038,18 @@ struct AbstrTiledUnitFromSizeOper: UnaryOperator bool CreateResult(TreeItemDualRef& resultHolder, const ArgSeqType& args, bool mustCalc) const override { - dms_assert(args.size() == 1); + assert(args.size() == 1); const AbstrDataItem* a1 = AsDataItem(args[0]); checked_domain(a1, "a1"); if (!resultHolder) { - dms_assert(!mustCalc); + assert(!mustCalc); AbstrUnit* result = debug_cast(GetResultClass())->CreateResultUnit(resultHolder); - dms_assert(result); + assert(result); + result->SetTSF(TSF_Categorical); + resultHolder = result; result->DuplFrom(a1->GetAbstrValuesUnit()); } diff --git a/geo/dll/src/BoostPolygon.cpp b/geo/dll/src/BoostPolygon.cpp index 92285d57e..16cc17f50 100644 --- a/geo/dll/src/BoostPolygon.cpp +++ b/geo/dll/src/BoostPolygon.cpp @@ -571,6 +571,8 @@ struct AbstrPolygonOperator : public VariadicOperator if (m_Flags & PolygonFlags::F_DoSplit) { resUnit = Unit::GetStaticClass()->CreateResultUnit(resultHolder); + resUnit->SetTSF(TSF_Categorical); + resultHolder = resUnit; resGeometry = CreateDataItem(resUnit, token::geometry, resUnit, values1Unit, ValueComposition::Polygon); if (!resDomain->IsKindOf(Unit::GetStaticClass())) @@ -984,6 +986,8 @@ class AbstrPolygonConnectivityOperator : public UnaryOperator const AbstrUnit* domain1Unit = arg1A->GetAbstrDomainUnit(); AbstrUnit* res = Unit::GetStaticClass()->CreateResultUnit(resultHolder); + res->SetTSF(TSF_Categorical); + resultHolder = res; AbstrDataItem* resF1 = CreateDataItem(res, tF1, res, domain1Unit); diff --git a/geo/dll/src/Dijkstra.cpp b/geo/dll/src/Dijkstra.cpp index 4df76fafb..db4e3d3e6 100644 --- a/geo/dll/src/Dijkstra.cpp +++ b/geo/dll/src/Dijkstra.cpp @@ -1348,6 +1348,8 @@ class DijkstraMatrOperator : public VariadicOperator if (flags(df & DijkstraFlag::OD)) { mutableResultUnit = GetResultUnitClass(df)->CreateResultUnit(resultHolder); + mutableResultUnit->SetTSF(TSF_Categorical); + resultHolder = mutableResultUnit; resultUnit = mutableResultUnit; resultContext = resultHolder; diff --git a/geo/dll/src/OperDistrict.cpp b/geo/dll/src/OperDistrict.cpp index 856653889..2edb51867 100644 --- a/geo/dll/src/OperDistrict.cpp +++ b/geo/dll/src/OperDistrict.cpp @@ -77,8 +77,10 @@ struct DistrictOperator : public UnaryOperator const AbstrUnit* domain = inputGridA->GetAbstrDomainUnit(); - AbstrUnit* resUnit = ResultUnitType::GetStaticClass()->CreateResultUnit(resultHolder); - dms_assert(resUnit); + auto resUnit = ResultUnitType::GetStaticClass()->CreateResultUnit(resultHolder); + resUnit->SetTSF(TSF_Categorical); + + assert(resUnit); resultHolder = resUnit; AbstrDataItem* diff --git a/geo/dll/src/OperPolygon.cpp b/geo/dll/src/OperPolygon.cpp index 96c41ef95..60046a368 100644 --- a/geo/dll/src/OperPolygon.cpp +++ b/geo/dll/src/OperPolygon.cpp @@ -438,16 +438,18 @@ struct AbstrArcs2SegmentsOperator : public UnaryOperator // Override Operator bool CreateResult(TreeItemDualRef& resultHolder, const ArgSeqType& args, bool mustCalc) const override { - dms_assert(args.size() == 1); + assert(args.size() == 1); - const AbstrDataItem* arg1A = debug_cast(args[0]); - dms_assert(arg1A); + auto arg1A = AsDataItem(args[0]); + assert(arg1A); const AbstrUnit* polyEntity = arg1A->GetAbstrDomainUnit(); const AbstrUnit* pointValuesUnit = arg1A->GetAbstrValuesUnit(); ResultUnitType* resDomain = debug_cast(ResultUnitType::GetStaticClass()->CreateResultUnit(resultHolder)); - dms_assert(resDomain); + assert(resDomain); + resDomain->SetTSF(TSF_Categorical); + resultHolder = resDomain; AbstrDataItem @@ -706,7 +708,9 @@ struct AbstrDynaPointOperator : public TernaryOperator = debug_cast( ResultUnitType::GetStaticClass()->CreateResultUnit(resultHolder) ); - dms_assert(resDomain); + assert(resDomain); + resDomain->SetTSF(TSF_Categorical); + resultHolder = resDomain; AbstrDataItem diff --git a/tic/dll/src/Xml/XmlTreeOut.cpp b/tic/dll/src/Xml/XmlTreeOut.cpp index 9f7c15767..c138d97ea 100644 --- a/tic/dll/src/Xml/XmlTreeOut.cpp +++ b/tic/dll/src/Xml/XmlTreeOut.cpp @@ -185,6 +185,9 @@ bool WriteUnitProps(XML_Table& xmlTable, const AbstrUnit* unit, bool allTileInfo if (unit->GetUnitClass() == Unit::GetStaticClass()) return true; + if (unit->GetTSF(TSF_Categorical)) + xmlTable.NameValueRow("Categorical", "Yes"); + if (unit->GetNrDimensions() == 1) { if (unit->GetValueType()->IsNumeric()) @@ -528,6 +531,8 @@ bool TreeItem_XML_DumpGeneralBody(const TreeItem* self, OutStreamBase* xmlOutStr vc = di->GetValueComposition(); if (vc != ValueComposition::Single) xmlTable.NameValueRow("ValueComposition", GetValueCompositionID(vc).GetStr().c_str()); + if (di->GetTSF(TSF_Categorical)) + xmlTable.NameValueRow("Categorical", "Yes"); WriteCdf(xmlTable, di); }