HRESULT DatenBasisObjekt::ModPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData) { TX_ASSERT(IsTRiASDBBased()); USES_CONVERSION; { bool fForceTypeChange = (MPForceForTRiASDBs & ((PBDMERKMAL *)pData) -> ipbdMTyp) ? true : false; // wenns ein Ansichtsmerkmal sein soll, dann einfach wieder raus if ((sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) && (MPViewFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F)) && !fForceTypeChange) { return S_FALSE; } // Objekteigenschaft aus globaler Tabelle lesen WTRiASFeature Feat; HRESULT hr = S_OK; if (FAILED(GetFeatureFromMap (pData -> pbdCode, Feat))) { TX_ASSERT(sizeof(PBDMERKMALEX) == pData -> dwSize); // Ident muß gegeben sein // Objekteigenschaft existiert nicht, also neu erzeugen TX_ASSERT(pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText); // KurzText muß gegeben sein // wiederauffinden des Objects-Objektes WTRiASObjects Objs; INT_PTR lIdent = ((PBDMERKMALEX *)pData) -> lIdent; if (-1 == lIdent) { // wenn Ident nicht gegeben ist dann muß DataSource eine GeoDB sein TX_ASSERT(DB(hPr).IsTRiASDataSource()); lIdent = DEX_GetUnknownIdentEx(hPr); // den erstbesten verwenden } RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs)); // Objektmenge muß existieren RETURN_FAILED_HRESULT(Objs -> get_Feature (CComVariant(pData -> pbdCode), VARIANT_TRUE, CComBSTR(g_cbNil), Feat.ppi())); if (!fForceTypeChange) { RETURN_FAILED_HRESULT(Feat -> put_Name (CComBSTR(pData -> pbdKText))); // reales, vergebenes Handle zurückliefern INT_PTR lHandle = 0; RETURN_FAILED_HRESULT(Feat -> get_Handle (&lHandle)); if (lHandle != pData -> pbdCode) { TX_TRACE2("TRiAS: ModPbdDataMerkmal: Changed FeatureHandle %lx -> %lx !", pData -> pbdCode, lHandle); pData -> pbdCode = lHandle; } // Notifikation rumschicken DEXN_FeatureSetModified(lIdent); } } else if (!fForceTypeChange || (MPObjectFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F))) { #if defined(_DEBUG) // Testen, ob der gegebene MCode zur geforderten Datenquelle paßt if (HACTCONNECTION != hPr) { HPROJECT hPrTarget = NULL; RETURN_FAILED_HRESULT(GetDatabaseOrProjectHandle (Feat, &hPrTarget)); TX_ASSERT(hPrTarget == hPr); // Ident aus anderer Datenquelle ? } #endif // defined(_DEBUG) // hier nur neuen KurzText (Namen) einstellen if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) RETURN_FAILED_HRESULT(Feat -> put_Name (CComBSTR(pData -> pbdKText))); // Notifikation rumschicken INT_PTR lIdent = -1L; if (sizeof(PBDMERKMALEX) == pData -> dwSize) { lIdent = ((PBDMERKMALEX *)pData) -> lIdent; // sicherstellen, daß dieser MCode schon zu dem Ident gehört (#HK030111) if (-1 != lIdent) { // schlimmstenfalls liefert _Add S_FALSE (wenns schon dazugehört) WTRiASObjects Objs; WTRiASFeatures Feats; WTRiASFeature TestFeat; RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs)); // Objektmenge muß existieren RETURN_FAILED_HRESULT(Objs -> get_Features (Feats.ppi())); if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) { // über den Namen gehts schneller if (S_OK != Feats -> Item (CComVariant(pData -> pbdKText), TestFeat.ppi())) { RETURN_FAILED_HRESULT(Feats -> _Add(Feat)); } } else { // kein Name gegeben, also Handle verwenden if (S_OK != Feats -> Item (CComVariant(pData -> pbdCode), TestFeat.ppi())) { RETURN_FAILED_HRESULT(Feats -> _Add(Feat)); } } } } DEXN_FeatureSetModified(lIdent); } if (!fForceTypeChange || (MPObjectFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F))) { // LangText (BeschreibungsInfo) einstellen if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) { RETURN_FAILED_HRESULT(Feat -> put_Description (CComBSTR(pData -> pbdLText))); } else { RETURN_FAILED_HRESULT(Feat -> put_Description (CComBSTR(g_cbNil))); } } // evtl. zusätzliche Infos speichern if (sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) { PBDMERKMAL *pPbdM = (PBDMERKMAL *)pData; FEATURETYPE rgType = FEATURETYPE_Object; // Objektmerkmal if (fForceTypeChange) rgType = FEATURETYPE(pPbdM -> ipbdMTyp & 0x7f); // ggf. neuer Typ if (pPbdM -> ipbdMTyp & PBDMERKMAL_SYSTEMFLAG) rgType = FEATURETYPE(rgType | FEATURETYPE_System); if (pPbdM -> ipbdMTyp & PBDMERKMAL_READONLY) rgType = FEATURETYPE(rgType | FEATURETYPE_ReadOnly); RETURN_FAILED_HRESULT(Feat -> put_Type (rgType)); } } return S_OK; }
namespace sample_data { /////////////////////////////////////////////////////////////////////////////// // Attributbeschreibungen const FEATUREDESC g_FeatDescs[] = { { FEATURETYPE(FEATURETYPE_Object|FEATURETYPE_ReadOnly|FEATURETYPE_IsPrimaryFeature|DATATYPE_FROM_VT(VT_BSTR)), L"Objektname", L"Name eines Objektes" }, // FEATURE_OBJEKTNAME { FEATURETYPE(FEATURETYPE_Object|FEATURETYPE_ReadOnly|DATATYPE_FROM_VT(VT_BSTR)), L"Bebauungsgrad", L"Prozentualer Flächenanteil der Bebauung" }, // FEATURE_BEBAUUNGSGRAD { FEATURETYPE(FEATURETYPE_Object|FEATURETYPE_ReadOnly|DATATYPE_FROM_VT(VT_BSTR)), L"Text", L"Angezeigter Text eines Textobjektes" }, // FEATURE_TEXT }; /////////////////////////////////////////////////////////////////////////////// // Attribute/Geometrien // Objekt1 const FEATURE g_FeaturesOfObject1[] = { { FEATURE_OBJEKTNAME, L"Fläche" }, { FEATURE_BEBAUUNGSGRAD, L"0.74" }, }; const double g_dGeomX1[] = { 44083.327, 44083.326, 44167.858, 44166.853, 44083.327, }; const double g_dGeomY1[] = { 185994.660, 185943.084, 185942.834, 185994.410, 185994.660, }; const GEOMETRY g_GeometryOfObject1 = { _countof(g_dGeomX1), g_dGeomX1, g_dGeomY1, 1, NULL }; // Objekt 2 const FEATURE g_FeaturesOfObject2[] = { { FEATURE_OBJEKTNAME, L"Fläche mit Insel" }, { FEATURE_BEBAUUNGSGRAD, L"0.08" }, }; const double g_dGeomX2[] = { 43989.787, 43984.507, 44042.155, 44057.557, 43989.787, 44004.310, 44031.594, 44028.073, 43999.909, 44004.310, }; const double g_dGeomY2[] = { 185943.223, 185907.089, 185900.519, 185942.127, 185943.223, 185933.369, 185925.704, 185917.217, 185916.671, 185933.369, }; const long g_lContour2[] = { 5, 5, }; const GEOMETRY g_GeometryOfObject2 = { _countof(g_dGeomX2), g_dGeomX2, g_dGeomY2, _countof(g_lContour2), g_lContour2, }; // Objekt 3 const FEATURE g_FeaturesOfObject3[] = { { FEATURE_OBJEKTNAME, L"Fläche mit Insel/Berührung" }, { FEATURE_BEBAUUNGSGRAD, L"0.42" }, }; const double g_dGeomX3[] = { 44106.405, 44120.927, 44185.616, 44172.414, 44124.743, 44106.405, 44124.743, 44160.533, 44123.567, 44124.743, }; const double g_dGeomY3[] = { 185918.312, 185887.106, 185901.614, 185918.038, 185927.005, 185918.312, 185927.005, 185902.435, 185900.793, 185927.005, }; const long g_lContour3[] = { 6, 4, }; const GEOMETRY g_GeometryOfObject3 = { _countof(g_dGeomX3), g_dGeomX3, g_dGeomY3, _countof(g_lContour3), g_lContour3, }; // Objekt 4 const FEATURE g_FeaturesOfObject4[] = { { FEATURE_OBJEKTNAME, L"Linie" }, }; const double g_dGeomX4[] = { 44197.830, 44234.719, 44230.767, 44200.465, }; const double g_dGeomY4[] = { 185935.744, 185939.022, 185973.989, 185956.505, }; const GEOMETRY g_GeometryOfObject4 = { _countof(g_dGeomX4), g_dGeomX4, g_dGeomY4, 1, NULL }; // Objekt 5 const FEATURE g_FeaturesOfObject5[] = { { FEATURE_OBJEKTNAME, L"Linie/geschlossen" }, }; const double g_dGeomX5[] = { 44004.163, 44044.126, 44045.004, 44018.655, 44004.163, }; const double g_dGeomY5[] = { 185964.428, 185960.877, 185989.560, 185982.184, 185964.428, }; const GEOMETRY g_GeometryOfObject5 = { _countof(g_dGeomX5), g_dGeomX5, g_dGeomY5, 1, NULL }; // Objekt 6 const FEATURE g_FeaturesOfObject6[] = { { FEATURE_OBJEKTNAME, L"Punkt" }, }; const double g_dGeomX6[] = { 44121.857, }; const double g_dGeomY6[] = { 185964.155, }; const GEOMETRY g_GeometryOfObject6 = { _countof(g_dGeomX6), g_dGeomX6, g_dGeomY6, 1, NULL }; // Objekt 7 const FEATURE g_FeaturesOfObject7[] = { { FEATURE_OBJEKTNAME, L"Text" }, { FEATURE_TEXT, L"Beispieltext" }, }; const double g_dGeomX7[] = { 44111.317, }; const double g_dGeomY7[] = { 185982.184, }; const GEOMETRY g_GeometryOfObject7 = { _countof(g_dGeomX7), g_dGeomX7, g_dGeomY7, 1, NULL }; /////////////////////////////////////////////////////////////////////////////// // Objekte const OBJECT g_Object1 = { L"9E81D1F3-C2B4-47BF-A01D-BE6449F55B79", OBJECTTYPE_Area, _countof(g_FeaturesOfObject1), g_FeaturesOfObject1, &g_GeometryOfObject1, }; const OBJECT g_Object2 = { L"8C65148D-E81E-4E04-8E9E-4CD132732676", OBJECTTYPE_Area, _countof(g_FeaturesOfObject2), g_FeaturesOfObject2, &g_GeometryOfObject2, }; const OBJECT g_Object3 = { L"2196692D-B584-4660-B675-78C27116ECA1", OBJECTTYPE_Area, _countof(g_FeaturesOfObject3), g_FeaturesOfObject3, &g_GeometryOfObject3, }; const OBJECT g_Object4 = { L"E6EB7AFE-AABB-44F9-8024-319A4D602554", OBJECTTYPE_Line, _countof(g_FeaturesOfObject4), g_FeaturesOfObject4, &g_GeometryOfObject4, }; const OBJECT g_Object5 = { L"84E4AEE1-C8CF-416F-BD64-A6AE7E38F39F", OBJECTTYPE_Line, _countof(g_FeaturesOfObject5), g_FeaturesOfObject5, &g_GeometryOfObject5, }; const OBJECT g_Object6 = { L"23588AD6-BA4F-44D2-B47F-1AAF6A4FC93E", OBJECTTYPE_Point, _countof(g_FeaturesOfObject6), g_FeaturesOfObject6, &g_GeometryOfObject6, }; const OBJECT g_Object7 = { L"1D3294DF-DF65-4010-BEAD-EA3D8E66E025", OBJECTTYPE_Text, _countof(g_FeaturesOfObject7), g_FeaturesOfObject7, &g_GeometryOfObject7, }; /////////////////////////////////////////////////////////////////////////////// // Objektklassen // Objektklasse 1 const int g_FeaturesOfObjectClass1[] = { FEATURE_OBJEKTNAME, FEATURE_BEBAUUNGSGRAD, }; const int g_ObjectsOfObjectClass1[] = { 0, 1, 2, }; const OBJECTCLASS g_ObjectClass1 = { L"1", L"Flächen", L"Objektklasse 1", OBJECTTYPE_Area, _countof(g_ObjectsOfObjectClass1), g_ObjectsOfObjectClass1, _countof(g_FeaturesOfObjectClass1), g_FeaturesOfObjectClass1, }; // Objektklasse 2 const int g_FeaturesOfObjectClass2[] = { FEATURE_OBJEKTNAME, }; const int g_ObjectsOfObjectClass2[] = { 3, 4, }; const OBJECTCLASS g_ObjectClass2 = { L"2", L"Linien", L"Objektklasse 2", OBJECTTYPE_Line, _countof(g_ObjectsOfObjectClass2), g_ObjectsOfObjectClass2, _countof(g_FeaturesOfObjectClass2), g_FeaturesOfObjectClass2, }; // Objektklasse 3 const int g_FeaturesOfObjectClass3[] = { FEATURE_OBJEKTNAME, }; const int g_ObjectsOfObjectClass3[] = { 5, }; const OBJECTCLASS g_ObjectClass3 = { L"3", L"Punkte", L"Objektklasse 3", OBJECTTYPE_Point, _countof(g_ObjectsOfObjectClass3), g_ObjectsOfObjectClass3, _countof(g_FeaturesOfObjectClass3), g_FeaturesOfObjectClass3, }; // Objektklasse 4 const int g_FeaturesOfObjectClass4[] = { FEATURE_OBJEKTNAME, FEATURE_TEXT, }; const int g_ObjectsOfObjectClass4[] = { 6, }; const OBJECTCLASS g_ObjectClass4 = { L"4", L"Texte", L"Objektklasse 4", OBJECTTYPE_Text, _countof(g_ObjectsOfObjectClass4), g_ObjectsOfObjectClass4, _countof(g_FeaturesOfObjectClass4), g_FeaturesOfObjectClass4, }; /////////////////////////////////////////////////////////////////////////////// // eigentliche Tabellen // umschließendes Rechteck aller Geometrien const double g_dContX[] = { 43984.507, 44234.719 }; // XMin/XMax const double g_dContY[] = { 185887.106, 185994.660 }; // YMin/YMax const GEOMETRY g_Container = { _countof(g_dContX), g_dContX, g_dContY, 1, NULL, }; // sämtliche Objektklassen const OBJECTCLASS *g_ObjectClasses[] = { &g_ObjectClass1, &g_ObjectClass2, &g_ObjectClass3, &g_ObjectClass4, }; // sämtliche Objekte const OBJECT *g_Objects[] = { &g_Object1, &g_Object2, &g_Object3, &g_Object4, &g_Object5, &g_Object6, &g_Object7, }; // Anzahl der Objektklassen/Objekte/Objekteigenschaften const int g_iObjectClassCount _countof(g_ObjectClasses); const int g_iObjectCount = _countof(g_Objects); const int g_iFeatDescCount = _countof(g_FeatDescs); } // namespace sample_data