Beispiel #1
0
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;
}
Beispiel #2
0
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