// Anzeige des aktuellen Maßstabes -------------------------------------------- bool IrisWind :: SetMasstab (Rectangle R) { // wenn Rechteck entartet ist, dann nichts ändern if (R.Right() == R.Left()) return false; Rectangle CRc = CanvasRect(); if (CRc.Left() == CRc.Right()) return false; // Icon // Koordinaten in DB-Koordinaten umsetzen CoordTrans *pCT = DBO().pCT(); TX_ASSERT(NULL != pCT); if (NULL == pCT) return false; Point ptLO = R.UpperLeft(); Punkt LO = DCtoOC (ptLO); // Device --> Objekt Point ptRU = R.LowerRight(); Punkt RU = DCtoOC (ptRU); #if defined(_KOORD_ISDOUBLE) DoublePair P1 (LO.GetX(), LO.GetY()); DoublePair P2 (RU.GetX(), LO.GetY()); // über X-Koordinate berechnen #else double XLO, XRU, YLO, YRU; pCT() -> UnScale (LO, &XLO, &YLO); pCT() -> UnScale (RU, &XRU, &YRU); DoublePair P1 (XLO, YLO); DoublePair P2 (XRU, YLO); // über X-Koordinate berechnen #endif // _KOORD_ISDOUBLE double dX = 1.0; if (pCT -> hasDistEx()) { double dY = 1.0; pCT -> CoordTransDistanceEx (&P1, &P2, dX, dY); } else dX = pCT -> CoordTransDistance (&P1, &P2); DoublePair dimD; Dimension DotsPerMM (GetDotsPerMM (NULL, &dimD)); long M = (long)((fabs(dX) * 1000.0 * dimD.Width()) / ((double)(CRc.Right()-CRc.Left()))); // Maßstab muß positiv sein if (M < 0L) M = -M; if (0 != m_lFakeZoom) DEXN_ScalingChanged (m_lFakeZoom); else DEXN_ScalingChanged (M); return true; }
bool CCoordTransService::UnScale (const Punkt &Pt, double *pX, double *pY) { if (NULL == pX || NULL == pY) return false; *pX = UnScaleX (Pt.GetX(), Pt.GetY()); *pY = UnScaleY (Pt.GetX(), Pt.GetY());; return true; }
HRESULT HitTest (LONG lONr, int iVisType, CRect &rrc, Punkt &rpt, CursPos *prgCP) { TEST_E_POINTER("HitTest", prgCP); // Epsilons berechnen LONG lEpsX = 0L; LONG lEpsY = 0L; LONG lEpsLine = 0L; switch (iVisType) { case VT_Punkt: RetrievePointDims (lONr, rrc, lEpsX, lEpsY); break; case VT_Linie: RetrieveLineDim (lONr, rrc, lEpsLine); break; case VT_Flaeche: break; // alle Eps sind 0 case VT_Text: *prgCP = CURSPOS_OBJECT; return S_OK; // Texte sind rechtwinklig default: return E_INVALIDARG; } // jetzt Geoemtrie genau testen try { WObjektGeometrie Obj (CLSID_ObjektGeometrie); // throws hr WInitObjektGeometrie Init (Obj); // throws hr THROW_FAILED_HRESULT(Init -> InitObjGeometry (lONr)); THROW_FAILED_HRESULT(Obj -> CursorInObject (rpt.GetX(), rpt.GetY(), lEpsX, lEpsY, lEpsLine, true, prgCP)); } catch (_com_error &e) { return _COM_ERROR(e); } return S_OK; }
bool CCoordTransService::NativeEx ( const double &rdX, const double &rdY, Punkt &outPt, LPVOID pData) { return NativeEx (rdX, rdY, &outPt.X(), &outPt.Y(), pData); }
bool CCoordTransService::MetricEx ( const Punkt &rPt, double *pX, double *pY, LPVOID pData) { return MetricEx (rPt.GetX(), rPt.GetY(), pX, pY, pData); }
/////////////////////////////////////////////////////////////////////////////// // Funktionen für parametrisierbare Transformationen bool CCoordTransService::GetMetricParam (const Punkt &rPt, LPVOID *ppData) { return GetMetricParam (rPt.GetX(), rPt.GetY(), ppData); }
bool CCoordTransService::Metric (const Punkt &Pt, double *pX, double *pY) { return Metric (Pt.GetX(), Pt.GetY(), pX, pY); }
bool CCoordTransService::Native ( const double &rdX, const double &rdY, Punkt &outPt) { return Native (rdX, rdY, &outPt.X(), &outPt.Y()); }
bool CCoordTransService::Scale (const double &rdX, const double &rdY, Punkt &outPt) { outPt.X() = ScaleX (rdX, rdY); outPt.Y() = ScaleY (rdX, rdY); return true; }
// Operatoren BOOL operator == (Punkt &P) { return ((P.X() == _X) && (P.Y() == _Y)); }