// -------------------------------------------------------------------------------------------- // 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
// -------------------------------------------------------------------------------------------- // 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 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 );