STDMETHODIMP COleObjectPropertyDual::SearchObjects(BSTR bstrToMatch, SEARCHMODE rgFlags, IEnumObjectsByNumber **ppvObj) { if (NULL == ppvObj) return E_POINTER; *ppvObj = NULL; _ASSERTE(m_fSearchAble); // muß suchen können COM_TRY { WDSearchAbleObjectProperty Search(m_ObjProp); WDGeoObjects Objs; THROW_FAILED_HRESULT(Search -> SearchObjects(bstrToMatch, GetSearchMode(rgFlags), Objs.ppi())); WQueryEnumLONG QueryEnum(Objs); WEnumLONG Enum; THROW_FAILED_HRESULT(QueryEnum -> QueryEnumLONG (Enum.ppi())); WEnumObjectsByNumber EnumObjs(Enum); *ppvObj = EnumObjs.detach(); } COM_CATCH; return S_OK; }
// ---------------------------------------------------------------------------- // PropertySequence_cmd_RedoActions // ---------------------------------------------------------------------------- void PropertySequence_cmd_RedoActions (ebHTHREAD hThread, int iNumArgs, ebARGS lpArgs) { BASIC_OP_TRACE(PropertySequence_cmd_RedoActions); WPropertyActionSequence Seq ((IPropertyActionSequence *)ebGetObject (lpArgs, 1)); WDataObject InData; _DGeoObjects *pIObjs = iNumArgs > 1 ? (_DGeoObjects *)ebGetObject (lpArgs, 2) : NULL; HRESULT hr = NOERROR; if (NULL != pIObjs) { WEnumLONG EnumObjs; hr = GetEnumLongFromGeoObjects (pIObjs, EnumObjs.ppi()); if (SUCCEEDED(hr)) { hr = CoCreateInstance (CLSID_DataTransferObject, NULL, CLSCTX_INPROC_SERVER, IID_IDataObject, InData.ppv()); if (SUCCEEDED(hr)) hr = SetEnumLONGData (EnumObjs, InData); else InData.Assign (NULL); // freigeben } pIObjs = NULL; // wird nicht mehr benötigt } Seq -> RedoActions (__hWndM, NULL, InData, NULL); }
// -------------------------------------------------------------------------------------------- // Ermittlung des Startindex lStartInd aus einer (evtl.) gemeinsamen Strecke mit einem schon // rechtwinklig gemachten Objekt, das aus zur gleichen Objektklasse wie das lONr-Objekt gehört; // gibt es kein solches Objekt, dann ist der return-Wert "S_FALSE", lStartInd ist in // diesem Fall unbestimmt HRESULT CGeoEditExtension::CommonLineWithRectObject (long lONr, KoOrd* plXK, KoOrd* plYK, long lCnt0, long& lStartInd) { KoOrd x0, y0, x1, y1; // Anfangs- und Endkoordinaten des längsten Konturabschnitts try { // Objektnummern aller Objekte der Objektklasse des lONr-Objektes bereitstellen WEnumLONG wEnumIn (CLSID_EnumObjectsByNumber); // throws_com_error ENUMLONGKEY ELK; ELK.eKey = DEX_GetObjIdentEx (lONr); ELK.eFcn = (ENUMLONGKEYPROC) GetRectObjects; ELK.ePtr = wEnumIn; DEX_EnumIdentObjects (ELK); if (0 == wEnumIn->Count()) // kein Objekt gefunden, das schon rechtwinklig gemacht return S_FALSE; // wurde ulong ulIdent = 0; // Identifikator für die Ergebnisobjekte (wird hier nicht // weiter benötigt) DWORD dwLageAusw = LAUSS; // nur die wEnumIn-Flächen für Vergleich heranziehen, die // außerhalb der lONr-Fläche liegen SpForm sfSForm = SFORM_TEMP; // temporäre Abspeicherung WEnumLONG wComCont (CLSID_EnumObjectsByNumber); // Objektnummern der gemeinsamen // Konturabschnitte if (! m_wObjOper.IsValid()) // (wenn noch nicht, dann) IExtendObjOper-Interface für { // CommonContour_ONr() zuschalten WUnknown wObjOper; ObjOperInterface (wObjOper.ppi()); m_wObjOper = wObjOper; } if (m_wObjOper.IsValid()) m_wObjOper->CommonContour_ONr (lONr, ulIdent, wEnumIn, dwLageAusw, sfSForm, wComCont.ppi()); else _ASSERTE (false); if (0 == wComCont->Count()) // keines der schon rechtwinklig gemachten Objekte hat return S_FALSE; // einen gemeinsamen Konturabschnitt mit dem lONr-Objekt // wenn es mindestens 1 gemeinsamen Konturabschnitt gibt, dann die längste Strecke // bestimmen THROW_FAILED_HRESULT (GiveLongestLine (wComCont, x0, y0, x1, y1)); VisualCommonContour (wComCont); } catch (_com_error& e) { return _COM_ERROR (e); } return StartIndex (plXK, plYK, lCnt0, x0, y0, x1, y1, lStartInd); } // CommonLineWithRectObject
// -------------------------------------------------------------------------------------------- STDMETHODIMP CRegOperatPropAct::EndAction (DWORD, IDataObject** ppDataOut) { _ASSERTE (m_ObjsIter != m_InObjs.end()); *ppDataOut = 0; try { WEnumLONG wEnumInObj (*m_ObjsIter); // die zu bearbeitenden Objekte WEnumLONG wEnumOutObj; // Ergebnisobjekte der ausgewählten Operation // Optionen abfragen DWORD dwOptions = 0x00; if (SUCCEEDED(EnsureOptionsIF())) { _ASSERTE(m_wOperOptions.IsValid()); m_wOperOptions->GetOptions (&dwOptions); } // im Dialog ausgewählte Operation ausführen THROW_FAILED_HRESULT (m_pRegOperDlg->ExecuteOperation (m_hPr, wEnumInObj, dwOptions, wEnumOutObj.ppi())); m_ObjsIter++; if (wEnumOutObj.IsValid()) { // IDataObject abfragen WDataObject IDO (CLSID_DataTransferObject); // Ergebnisobjekte im DataObjekt IDO speichern THROW_FAILED_HRESULT (SetEnumLONGData ( (IEnum<LONG>*)(IEnumLONG*)wEnumOutObj, IDO)); // Resultat setzen *ppDataOut = IDO.detach(); if (0 == wEnumOutObj->Count()) { ResString resTitel (ResID (IDS_LONGCLASSNAME, pRF), 50); ResString resText (ResID (IDS_BOXTEXT1, pRF), 200); MessageBox (__hWndM, resText.Addr(), resTitel.Addr(), MB_ICONINFORMATION | MB_OK); } } } catch (_com_error& hr_result) // 23.09.99 { DELETE_OBJ (m_pRegOperDlg); // bei Fehler Dialog wieder freigeben return _COM_ERROR(hr_result); // 23.09.99 } if (m_ObjsIter != m_InObjs.end()) // es kommen noch weitere Daten return S_FALSE; DELETE_OBJ (m_pRegOperDlg); // es kommen keine Daten mehr return S_OK; } // EndAction
// -------------------------------------------------------------------------------------------- STDMETHODIMP CRegOperatPropAct::DoAction (IDataObject* pDataObj, DWORD) { WEnumLONG wEnumObj; HRESULT hr = GetEnumLONGData (pDataObj, (IEnum<LONG>**)(IEnumLONG**)wEnumObj.ppi()); if (FAILED(hr)) return hr; // Enumerator (an PropertyPage übergebene Objekte) in Liste speichern m_InObjs.push_back (wEnumObj); // Enumerator am Ende der Liste anfügen if (1 == m_InObjs.size()) m_ObjsIter = m_InObjs.begin(); // Iterator zeigt auf das 1. Element der Liste return hr; } // DoAction
// -------------------------------------------------------------------------------------------- // Ermittlung des Startindex lStartInd aus einer (evtl.) gemeinsamen Strecke mit einem // pEnumIn-Objekt; gibt es kein solches Objekt, dann ist der return-Wert "S_FALSE", lStartInd // ist in diesem Fall unbestimmt HRESULT CGeoEditExtension::CommonLine (long lONr, KoOrd* plXK, KoOrd* plYK, long lCnt0, IEnumLONG* pEnumIn, long& lStartInd) { if (NULL == pEnumIn) return S_FALSE; KoOrd x0, y0, x1, y1; // Anfangs- und Endkoordinaten des längsten Konturabschnitts try { ulong ulIdent = 0; // Identifikator für die Ergebnisobjekte (wird hier nicht // weiter benötigt) DWORD dwLageAusw = LINAU; // nur die pEnumIn-Flächen für Vergleich heranziehen, die // sowohl innerhalb als auch außerhalb der lONr-Fläche // liegen SpForm sfSForm = SFORM_TEMP; // temporäre Abspeicherung WEnumLONG wComCont (CLSID_EnumObjectsByNumber); // Objektnummern der gemeinsamen // Konturabschnitte if (! m_wObjOper.IsValid()) // (wenn noch nicht, dann) IExtendObjOper-Interface für { // CommonContour_ONr() zuschalten WUnknown wObjOper; ObjOperInterface (wObjOper.ppi()); m_wObjOper = wObjOper; } if (m_wObjOper.IsValid()) m_wObjOper->CommonContour_ONr (lONr, ulIdent, pEnumIn, dwLageAusw, sfSForm, wComCont.ppi()); else _ASSERTE (false); if (0 == wComCont->Count()) // keines der pEnumIn-Objekt hat einen gemeinsamen return S_FALSE; // Konturabschnitt mit dem lONr-Objekt // wenn es mindestens 1 gemeinsamen Konturabschnitt gibt, dann die längste Strecke // bestimmen THROW_FAILED_HRESULT (GiveLongestLine (wComCont, x0, y0, x1, y1)); VisualCommonContour (wComCont); } catch (_com_error& e) { return _COM_ERROR (e); } return StartIndex (plXK, plYK, lCnt0, x0, y0, x1, y1, lStartInd); } // CommonLine
STDMETHODIMP CTextSearchEngine::DoAction (IDataObject *pIDataObj, DWORD) { if (NULL == m_pCfgDlg) return E_UNEXPECTED; WEnumLONG EnumObj; HRESULT hr = GetEnumLONGData (pIDataObj, EnumObj.ppi()); if (S_OK == hr) { // JG 980916 für ProgInd vorbereiten m_pCfgDlg -> SetAction(this); hr = m_pCfgDlg -> SetEnumLONG (EnumObj); } return hr; }
// -------------------------------------------------------------------------------------------- // Fügt extern bereitgestellte Objekte zu den ausgewählten Objekten hinzu STDMETHODIMP CGeoEditExtension::AddObjects (IDispatch* pIDisp) { try { WQueryEnumLONG QE (pIDisp); WEnumLONG Enum; THROW_FAILED_HRESULT(QE->QueryEnumLONG (Enum.ppi())); return m_wTopObjs->InitWithExternalObjects (WEnumObjectsByNumber(Enum)); } catch (_com_error& e) { return _COM_ERROR (e); } } // AddObjects
STDMETHODIMP CCodeLine::DoAction (IDataObject *pIDataObj, DWORD dwReserved) { m_iErrorCode = m_pCfgDlg->GetErrorCode(); // Eingabeobjekte einfach mit zu unserer Objektmenge hinzufügen COM_TRY { WEnumLONG EnumObjs; OutEnumLONG iter_out_if (&m_Objects); THROW_FAILED_HRESULT(PropActBase::GetEnumObjects (pIDataObj, __uuidof(IEnumLONG), EnumObjs.ppv())); copy (InEnumLONG(EnumObjs), InEnumLONG(), iter_out_if); } COM_CATCH; return S_OK; }
// -------------------------------------------------------------------------------------------- STDMETHODIMP CAreaBuildPropAct::EndAction (DWORD, IDataObject** ppDataOut) { _ASSERTE (m_ObjsIter != m_InObjs.end()); *ppDataOut = 0; COM_TRY { WEnumLONG wEnumInObj (*m_ObjsIter); // die zu bearbeitenden Objekte WEnumLONG wEnumOutObj; // Ergebnisobjekte der ausgewählten Operation // Optionen abfragen DWORD dwOptions = 0x00; if (m_wOperOptions.IsValid()) m_wOperOptions->GetOptions (&dwOptions); // im Dialog ausgewählte Operation ausführen THROW_FAILED_HRESULT (m_pAreaBuildDlg->ExecuteOperation (m_hPr, wEnumInObj, dwOptions, wEnumOutObj.ppi())); m_ObjsIter++; if (wEnumOutObj.IsValid()) { // IDataObject abfragen WDataObject IDO (CLSID_DataTransferObject); // Ergebnisobjekte im DataObjekt IDO speichern THROW_FAILED_HRESULT (SetEnumLONGData ((IEnum<LONG>*)(IEnumLONG*)wEnumOutObj, IDO)); // Resultat setzen *ppDataOut = IDO.detach(); if (0 == wEnumOutObj->Count()) { ResString resTitel (ResID (IDS_LONGCLASSNAME, pRF), 50); ResString resText (ResID (IDS_BOXTEXT7, pRF), 200); MessageBox (__hWndM, resText.Addr(), resTitel.Addr(), MB_ICONINFORMATION | MB_OK); } } } COM_CATCH_OP( delete m_pAreaBuildDlg; // bei Fehler Dialog wieder freigeben );
STDMETHODIMP CSelectExportObjects::DoAction (IDataObject *pIDataObj, DWORD dwReserved) { // Eingabeobjekte einfach mit zu unserer Objektmenge hinzufügen if (NULL != pIDataObj) { // evtl. keine Eingabeobjektmenge gegeben COM_TRY { // aber nur Objekte der geforderten Datenquellen übernehmen WEnumLONG EnumObjs; OutEnumLONG iter_out (&m_Objects); if (S_OK == GetEnumLONGData (pIDataObj, __uuidof(IEnumLONG), EnumObjs.ppv())) { remove_copy_if (InEnumLONG(EnumObjs), InEnumLONG(), iter_out, CObjectToCopy(m_setDataSources)); } } COM_CATCH; }
// ---------------------------------------------------------------------------- // PropertySequence_func_RedoActions // ---------------------------------------------------------------------------- void PropertySequence_func_RedoActions (ebHTHREAD hThread, int iNumArgs, ebARGS lpArgs) { BASIC_OP_TRACE(PropertySequence_func_RedoActions); ebSetObject (lpArgs, 0, (DWORD)NULL); WPropertyActionSequence Seq ((IPropertyActionSequence *)ebGetObject (lpArgs, 1)); WDataObject InData, OutData; _DGeoObjects *pIObjs = iNumArgs > 1 ? (_DGeoObjects *)ebGetObject (lpArgs, 2) : NULL; HRESULT hr = NOERROR; if (NULL != pIObjs) { WEnumLONG EnumObjs; hr = GetEnumLongFromGeoObjects (pIObjs, EnumObjs.ppi()); if (SUCCEEDED(hr)) { hr = CoCreateInstance (CLSID_DataTransferObject, NULL, CLSCTX_INPROC_SERVER, IID_IDataObject, InData.ppv()); if (SUCCEEDED(hr)) hr = SetEnumLONGData (EnumObjs, InData); else InData.Assign (NULL); // freigeben } pIObjs = NULL; // wird nicht mehr benötigt } hr = Seq -> RedoActions (__hWndM, NULL, InData, OutData.ppi()); if (SUCCEEDED(hr)) { WEnumLONG EnumObjs; if (NULL != (IUnknown *)OutData) hr = GetEnumLONGData (OutData, EnumObjs.ppi()); if (SUCCEEDED(hr)) // jetzt Collection der GeoObjects generieren hr = GetGeoObjectsFromEnumlong (EnumObjs, &pIObjs); } if (SUCCEEDED(hr)) ebSetObject (lpArgs, 0, (DWORD)pIObjs); }
STDMETHODIMP CTextSearchEngine::EndAction (DWORD, IDataObject **ppDataObj) { if (NULL == m_pCfgDlg) return E_UNEXPECTED; if (NULL == ppDataObj) return E_POINTER; *ppDataObj = NULL; COM_TRY { // DataObject generieren und mit EnumObj füllen WEnumLONG EnumObj; THROW_FAILED_HRESULT(m_pCfgDlg -> GetEnumLONG (EnumObj.ppi())); WDataObject IDO (CLSID_DataTransferObject); THROW_FAILED_HRESULT(SetEnumLONGData (EnumObj, IDO)); *ppDataObj = IDO.detach(); } COM_CATCH_OP((delete m_pCfgDlg, m_pCfgDlg = NULL)); // rechercvhe liefert immer nur eine Objektmenge DELETE_OBJ(m_pCfgDlg); // Dialog wird nicht mehr gebraucht return S_OK; }
// Object bearbeiten ---------------------------------------------------------- int end_previous_object (void) { long irc = 0L; lgi++; /* Geometriezaehler korrigieren */ if (lgi < koord_paare) return (db_error (EGCNT, ASCPARSER, yylineno)); // bevor irgend etwas passiert Header neu einlesen if (g_fReReadHeader) { DEXN_ReReadHeader(); DEXN_ReScale(); g_fReReadHeader = false; // nur einmal } // auswerten ob Komplexobjekt if (lgi == 0) { if (RelCount() == 0) return db_error (EBADKO, ASCPARSER, yylineno); if (!r_flag) return EOKAY; // keine Relationen, keine KomplexObjekte sta[0] = K_OBJEKT; // Status setzen sta[1] = 0; } HPROJECT hPr = DEX_GetDataSourceHandle(); _ASSERTE(NULL != hPr); irc = CreateObject (on, id, sta, mi, lgi, gxi, gyi); if (g_flag) { // evtl. ObjectGuid setzen if (irc && '\0' != guid[0]) { OBJECTGUID OUID; INITSTRUCT (OUID, OBJECTGUID); OUID.lONr = on; if (SUCCEEDED(CLSIDFromString (WideString(guid), &OUID.guid))) { // versuchen über GUID zu finden if (FAILED(DEX_FindObjectFromGuidEx (hPr, OUID))) { // alten Guid wieder setzen HRESULT hr = DEX_SetObjectGuid (OUID); // if (FAILED(hr) && HRESULT_FROM_ERRCODE(S_DUPLICATE) == hr) { // TX_ASSERT(0 != OUID.lONr); // Objekt muß existieren // // // GUID bereits in GeoDB vorhanden !!?? // irc = S_DUPLICATE; // // // neu erzeugtes Objekt löschen // DEX_DeleteObject (on); // CountObjects (sta[1], false); // // // Geometrie an existierendem Objekt korrigieren // on = OUID.lONr; // hier spielt die Musik // irc = CreateObject (on, id, sta, mi, lgi, gxi, gyi); // } } } } } else irc = UpdateFeatures (hPr, on, id, sta, mi); // evtl. zur AusgabeObjektmenge hinzufügen if (irc && g_Enum.IsValid()) g_Enum -> AddItem (on); // Protocoll, Relationen etc. bool fBreak = false; if (NULL != g_pDlg) { if (irc) g_pDlg -> SetPos (ftell (yyin), on); fBreak = g_pDlg -> Break(); } if (fpProt) fprintf (fpProt, "Satz %5ld, Objekt %5ld: Irc = %3ld\n", satz_nr, on, irc); if (irc && r_flag) { if (RelCount()) { // Relationen aufbauen long lONr, lRCode; short iRTyp; ResetList(); while (RetrieveNextFromList (&lONr, &lRCode, &iRTyp)) CreateRelation (on, lONr, lRCode, iRTyp); ClearList(); } // Zuordnung Objekt <--> SatzNummer für Relationen merken StoreInTree (on, satz_nr); } return fBreak; }
STDMETHODIMP CImpAscExtension::ImportDataWithResult ( IEnumString *pEnumFiles, DWORD dwFlags, IProgressIndicator *pIStatus, IEnumLONG **ppIObjs) { LPWSTR pFile = NULL; ULONG ulGot = 0; HRESULT hr = ResultFromScode (E_FAIL); // ImportModi setzen r_flag = (dwFlags & TOIMPORT_RELATIONS) ? true : false; g_flag = (dwFlags & TOIMPORT_GEOMETRY) ? true : false; m_flag = (dwFlags & TOIMPORT_FEATURES) ? true : false; // ZählerVariablen initialisieren g_lPoints = 0; g_lLines = 0; g_lAreas = 0; g_lTexts = 0; g_lKomplex = 0; g_lWithErrors = 0; g_lNotImported = 0; g_fReReadHeader = false; // eigentlichen Import durchführen if (NULL != ppIObjs) { try { g_Enum = WEnumLONG (CLSID_EnumObjectsByNumber); } catch (...) {} } USES_CONVERSION; if (NULL == pIStatus) { CStatusDlg SDlg (g_pTE -> MWind()); // StatusDialog bool fShown = false; g_pDlg = &SDlg; g_lFullTime = 0L; // GesamtZeit pEnumFiles -> Reset(); while (S_OK == pEnumFiles -> Next (1, (LPOLESTR *)&pFile, &ulGot)) { // alle Dateien nacheinander abarbeiten if (!fShown) { SDlg.Show(); fShown = true; } hr = ImportASC (OLE2A(pFile)); CoTaskMemFree (pFile); if (FAILED(hr)) break; } g_pDlg = NULL; } else { g_pDlg = NULL; g_lFullTime = 0L; // GesamtZeit pEnumFiles -> Reset(); while (S_OK == pEnumFiles -> Next (1, (LPOLESTR *)&pFile, &ulGot)) { // alle Dateien nacheinander abarbeiten hr = ImportASC (OLE2A(pFile)); CoTaskMemFree (pFile); if (FAILED(hr)) break; } } // evtl. Enumerator liefern if (NULL != ppIObjs) *ppIObjs = (IEnumLONG *)g_Enum.detach(); // Abschlußdialog nach jedem File - Übergangslösung // Neues Interface in allen Import-Funktionen nachziehen und Objekt(g_Enum) auswerten // -> neue Schnittstelle : ImportDataWithResult /*if (NULL == ppIObjs) */ { DEX_PostRebuildSight(); // alles neu zeichnen // ResultatsDialog anzeigen CResultDlg RDlg (g_pTE -> MWind()); RDlg.SetTexts (g_lTexts); RDlg.SetLines (g_lLines); RDlg.SetAreas (g_lAreas); RDlg.SetPoints (g_lPoints); RDlg.SetKomplex (g_lKomplex); RDlg.SetWithErrors (g_lWithErrors); RDlg.SetNotImported (g_lNotImported); RDlg.SetImported (g_lPoints + g_lLines + g_lAreas + g_lTexts + g_lKomplex); SetTime (g_lFullTime, RDlg.m_ftTime); MessageBeep (MB_ICONASTERISK); // fertig !! RDlg.Show (Centre); } return hr; }