Daha çox

OnAfterDraw-da PageLayoutControl-da mətn çəkilsin?


Çap önizləmə dialoqunda bir PagyLayoutControl var. Master MapControl ilə eyni dərəcəni və təbəqələri göstərir. PageLayoutControl-da edilən dəyişikliklər MapControl-da əks olunmayacağı üçün hər iki nəzarət də sinxronizasiya edilmir. Beləliklə, mən eyni xəritə faylını PageLayoutControl-a yükləyirəm və qatları MapControl-dan kopyalayıram. Yaxşı işləyir.

MapControl, AfterDraw hadisəsindəki seçilmiş xüsusiyyətlərə bəzi mətnlər əlavə edir:

Şəxsi boşluq MapControl_OnAfterDraw (obyekt göndərən, ESRI.ArcGIS.Controls.IMapControlEvents2_OnAfterDrawEvent e) {if (e.viewDrawPhase == (int) esriViewDrawPhase.esriViewForeground) {for (int iL = 0ap;  = 0)) {object ofskz = feature.get_Value (iBt1); if (ofskz! = null) {String someText = ofskz.ToString (); _mapControl.DrawShape (feature.Shape); IArea farea = xüsusiyyət. IArea şəklində; ESRI.ArcGIS.Geometry.Point start = yeni ESRI.ArcGIS.Geometry.Point (); start.X = farea.LabelPoint.X - 100; start.Y = farea.LabelPoint.Y; ESRI.ArcGIS.Geometry.Point end = yeni ESRI.ArcGIS.Geometry.Point (); end.X = farea.LabelPoint.X + 100; son.Y = farea.LabelPoint.Y; ESRI.ArcGIS.Geometry.Polyline təməl = yeni ESRI.ArcGIS.Geometry.Polyline (); bazeline.AddPoint (başlanğıc); bazeline.AddPoint (son); ITextSymbol textSymbol = yeni TextSymbolClass (); textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVACenter; obyekt oTextSym = textSymbol; _mapControl.DrawText ((ESRI.ArcGIS.Geometry.IGeometry) təməl, someText, ref oTextSym); }}}}}}}

Bunu PageLayoutControl üçün çoxaltmağa çalışdım, amma MapControls kimi metodlar olmadığı üçün uğursuz oldum.DrawTextDrawShape. Bənzər bir şey tapmadımDrawShapePageLayoutControl ilə. Tamam, şəkli çəkilmədən yaşaya bilərəm. Ancaq mətn məni səhv edir. Tapdım və sınadımActiveView.ScreenDisplay.DrawTexthəqiqətən xəritədə mətn çəkir, lakin göründüyü kimi fərqli bir yerləşdirmə istifadə edirMapControl.DrawText. Sadəcə. İstifadə etməyə çalışdımNöqtəbaşlamaqkimiİQeometriyaüçünDrawText:

private void Pagelayout_OnAfterDraw (object sender, ESRI.ArcGIS.Controls.IPageLayoutControlEvents_OnAfterDrawEvent e) {if (e.viewDrawPhase == (int) esriViewDrawPhase.esriViewForeground) {for (int iL = IV; ) {IFeatureSelection xüsusiyyətləri = _pageLayoutControl.ActiveView.FocusMap.Layer [iL] IFeatureSelection kimi; if ((features! = null) && (features.SelectionSet! = null)) {ICursor imleci; features.SelectionSet.Search (null, true, out kursor); IF xüsusiyyət; while ((xüsusiyyət = ((IFeatureCursor) imleci) .NextFeature ())! = boş) {int iBt1 = feature.Fields.FindField ("TEXT1"); əgər (iBt1 <0) iBt1 = feature.Fields.FindField ("NAME"); əgər ((feature.Shape! = null) && (iBt1> = 0)) {object ofskz = feature.get_Value (iBt1); if (ofskz! = null) {String someText = ofskz.ToString (); //_mapControl.DrawShape(feature.Shape); IArea farea = xüsusiyyət. IArea şəklində; ESRI.ArcGIS.Geometry.Point start = yeni ESRI.ArcGIS.Geometry.Point (); start.X = farea.LabelPoint.X - 100; start.Y = farea.LabelPoint.Y; ITextSymbol textSymbol = yeni TextSymbolClass (); textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVACenter; obyekt oTextSym = textSymbol; int mapx; int mapy; _pageLayoutControl.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint (start, mapx, out mapy); IPoint nöqtəsi = yeni ESRI.ArcGIS.Geometry.Point (); point.X = mapx; point.Y = xəritəli; _pageLayoutControl.ActiveView.ScreenDisplay.DrawText ((IGeometry) point, someText); }}}}}}}}

Mətn xəritədə bir yerə çəkilir, lakin MapControl-da çəkildiyi yerdə deyil.başlamaq3103951.3241, 2503651.3274 kimi bir dəyəri var, mənə elə gəlir ki, dünya koordinatlarıdır. Siçan mövqeyində (6.4,7.2 kimi bir şey - ekran koordinatları) düzgün mövqedə çəkən şəkillər çəkməyi sınadım. Beləliklə konversiyanı sınadımFromMapPointrəqəmləri dəyişdirdi, lakin düzgün mövqedə çəkməkdə müvəffəq olmadı.

DrawText üçün doğru giriş koordinatını necə tapa bilərəm? Yoxsa PageLayoutControl-da mətn çəkmək üçün alternativ bir yol varmı?


Bir poqelayoutun birdən çox xəritəyə sahib ola biləcəyini unutmayın. Layihədə müəyyən bir xəritəyə mətn çəkmək üçün IGraphicsContainer.FindFrame istifadə edə və IMap-ı keçə bilər və ya IGraphicsContainer.Next () istifadə edərək bir IMapFrame tapana qədər bütün elementlərdən keçə bilərsiniz. İşə başlamazdan əvvəl IGraphicsContainer.Reset'i axtardığınızdan əmin olun və qruplaşdırdığınız elementlərə sahib olduğunuzdan xəbərdar olun.

Bir IMapFrame tapdıqdan sonra IMapFrame.Map-i IActiveViewEvents_Event-ə atın və AfterDraw-ı bağlayın və mətni həmin işləyiciyə çəkin.


Videoya baxın: How to use LCD LCD1602 with I2C module for Arduino - Robojax (Oktyabr 2021).