Daha çox

ArcObjects istifadə edərək siçan klikinin çoxbucaqlıya düşüb -düşmədiyini təyin edirsiniz?

ArcObjects istifadə edərək siçan klikinin çoxbucaqlıya düşüb -düşmədiyini təyin edirsiniz?


Mövcud activeView qrafik konteynerindən istifadə edərək bir təbəqənin üstünə çəkilmiş bir çoxbucaq var, sonra istifadəçi çoxbucağın daxilində sağ tıklayırsa xüsusi bir kontekst menyusu göstərmək istəyərəm. Beləliklə, siçan tıklamasının çoxbucaqlı yerə düşüb düşmədiyini müəyyən etmək üçün bir yol tapmalıyam. Bu sualda təklif edildiyi kimi IRelationalOperator2 -dən istifadə etməyə çalışdım Hər kəs bir nöqtənin bir çoxbucaqda olub olmadığını müəyyən etmək üçün bir funksiyanı bilirmi ?, amma düzgün işləmədiyini düşünürəm. İndiyə qədər əldə etdiyim şey budur:

System.Drawing.Point screenMousePoint = System.Windows.Forms.Form.MousePosition; IPoint ekran nöqtəsi = yeni nöqtə (); screenPoint.X = ekranMousePoint.X; screenPoint.Y = ekranMousePoint.Y; IPoint mapPoint = this.controller.GetMapCoordinatesFromScreenCoordinates (screenPoint, activeView); // this.currentDefinedArea bir çoxbucaqlı IRelationalOperator2 əlaqəsidir = this.currentDefinedArea kimi IRelationalOperator2; if (relat.Contains (mapPoint))) {// Kontekst menyusunu göstər}

"GetMapCoordinatesFromScreenCoordinates" metodu bu kimi görünür və arcobjects -ə daxil olan parçalardan biridir:

ictimai IPoint GetMapCoordinatesFromScreenCoordinates (IPoint screenPoint, IActiveView activeView) {if (screenPoint == null || screenPoint.IsEmpty || activeView == null) {return null; } IScreenDisplay screenDisplay = activeView.ScreenDisplay; IDisplayTransformation displayTransformation = ekranDisplay.DisplayTransformation; return displayTransformation.ToMapPoint ((System.Int32) screenPoint.X, (System.Int32) screenPoint.Y); }

Yuxarıdakı kodun uğursuzluğa səbəb olduğunu öyrəndim. İstifadə:

System.Drawing.Point screenMousePoint = System.Windows.Forms.Form.MousePosition;

… OnMouseDown üsulu ilə təmin edilən MouseEventArgs istifadə etməkdən fərqli olaraq fərqli X, Y koordinatları verir. Niyə ilk növbədə onlardan istifadə etmədiyimi bilmirəm ... iş kodum belə görünür:

OnMouseDown (ESRI.ArcGIS.Desktop.AddIns.Tool.MouseEventArgs arg) {if (arg.Button == System.Windows.Forms.MouseButtons.Right) {if (this.controller.CurrentDefinedArea! = null) {IPoint screenPoint = yeni nöqtə (); screenPoint.X = arg.X; screenPoint.Y = arg.Y; IPoint mapPoint = this.controller.GetMapCoordinatesFromScreenCoordinates (screenPoint, activeView); IRelationalOperator2 əlaqəsi = this.controller.CurrentDefinedArea kimi IRelationalOperator2; if (relat.Contains (mapPoint)) {this.controller.CreateContextMenu (ArcMap.Application); }}}}

Peter Krebs'in siçan aşağıya təklif etdiyi kimi, XY məlumatını bir nöqtə qrafikinə təyin etmək üçün IDisplayTransformation.ToMapPoint istifadə edin. Daha sonra bu qrafikdən çoxbucaqlı qatınıza qarşı seçici kimi istifadə edə bilərsiniz.

ictimai etibarsız OnMouseDown (int Button, int Shift, System.Int32 X, System.Int32 Y) {//MyBase.OnMouseDown(Button, Shift, X, Y) cəhd edin {IMxApplication pMxApp = null; IActiveView ActiveView = standart (IActiveView); pMxApp = (IMxApplication) m_App; m_MxDoc = (IMxDocument) m_App.Document; m_mxDocument = (MxDocument) m_App.Document; ActiveView = (IActiveView) (Xəritə) m_MxDoc.FocusMap; IMap pMap = standart (IMap); ISpatialReference pSpatialRef = default (ISpatialReference); pMap = m_MxDoc.FocusMap; pSpatialRef = pMap.SpatialReference; IScreenDisplay m_pDisplay = ActiveView.ScreenDisplay; m_pDisplay.StartDrawing (m_pDisplay.hDC, Convert.ToInt16 (esriScreenCache.esriNoScreenCache)); ISimpleMarkerSymbol simpleMarkerSymbol = yeni SimpleMarkerSymbolClass (); ISymbol simvolu = simpleMarkerSymbol kimi ISymbol; // Dinamik Yayım m_pDisplay.SetSymbol (simvol); IDisplayTransformation displayTransformation = m_pDisplay.DisplayTransformation; // X və Y cihaz koordinatlarında m_Point = displayTransformation.ToMapPoint (X, Y); m_pDisplay.DrawPoint (m_Point); m_pDisplay.FinishDrawing (); Xüsusiyyət seçin (); } catch (Exception ex) {MessageBox.Show ("Zəng kodunda təyin olunmamış bir səhv tutuldu:" + Constants.vbCrLf + ex.ToString ()); }} ictimai boşluğu SelectFeature () {// SelectFeature cəhd edin {ILayer pLayer = default (ILayer); IActiveView pActiveView = standart (IActiveView); IEnvelope pEnvelope = standart (IEnvelope); ISpatialFilter pSF = default (ISpatialFilter); IEnumLayer pEnumLayer = standart (IEnumLayer); m_MxDoc = (IMxDocument) m_App.Document; m_mxDocument = (MxDocument) m_App.Document; m_map = (Xəritə) m_MxDoc.FocusMap; pActiveView = (IActiveView) m_map; əgər (m_map.LayerCount == 0) qayıt; pEnumLayer = m_map.Layers; pLayer = pEnumLayer.Next; while (! (pLayer == null)) {if (pLayer.Name == "My Polygon Layer") {m_FLayer = (IFeatureLayer) pLayer; } başqa {qayıt; } pLayer = pEnumLayer.Next; } m_FSel = (IFeatureSelection) m_FLayer; // Daha yaxşı axtarış nəticələri vermək üçün nöqtələr zərfini genişləndirin pEnvelope = m_MxDoc.CurrentLocation.Envelope; pEnvelope.Expand (m_MxDoc.SearchTolerance, m_MxDoc.SearchTolerance, yalan); pSF = yeni SpatialFilter (); pSF.Geometry = pEnvelope; pSF.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; pSF.GeometryField = m_FLayer.FeatureClass.ShapeFieldName; // Köhnə seçimi silmək üçün yeniləyin //pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, Heç nə, Heç bir şey) // M_FSel.SelectFeatures (pSF, esriSelectionResultEnum.esriSelectionResult) siçan üzərində yaradılmış bir nöqtədən istifadə edərək seçimi həyata keçirin. ISelectionSet pSelSet2 = standart (ISelectionSet); // Bütün seçilmiş xüsusiyyətləri çəkin. pSelSet2 = m_FSel.SelectionSet; if (pSelSet2.Count == 0) {MessageBox.Show ("Çoxbucaq seçilməyib"); } başqa {MessageBox.Show ("Çoxbucaq seçildi"); } // Yeni seçim pActiveView.PartialRefresh çəkmək üçün yenidən yeniləyin (esriViewDrawPhase.esriViewGeoSelection, null, null); } catch (Exception ex) {MessageBox.Show ("Zəng kodunda təyin olunmamış bir səhv tutuldu:" + Constants.vbCrLf + ex.ToString ()); }}

Üç səbəb. Bir inkişaf etdirici qrupu arasında # istifadəsini təşviq etmək, istər -istəməz bəzilərinin belə adlandırılan funksiyanın qaytarılma dəyərindən istifadə etməsinə səbəb olur:

Ancaq sonra onclick -də return doSomething () istifadə etməyi unudurlar və sadəcə doSomething () istifadə edirlər.

# -Dən qaçmağın ikinci səbəbi, çağırılan funksiya səhv atarsa, son qaytarma yalanının icra edilməməsidir. Bu səbəbdən inkişaf etdiricilər çağırılan funksiyada hər hansı bir xətanı uyğun şəkildə idarə etməyi də unutmamalıdırlar.

Üçüncü səbəb onclick hadisə xüsusiyyətinin dinamik olaraq təyin edildiyi halların olmasıdır. Xüsusilə bu və ya digər üsul üçün funksiyanı kodlaşdırmadan bir funksiyaya zəng etməyi və ya dinamik olaraq təyin etməyi üstün tuturam. Buna görə HTML işarələməsindəki onclick (və ya hər hansı bir şey) belə görünür:

JavaScript: void (0) istifadə etmək yuxarıdakı baş ağrısının hamısını aradan qaldırır və mənasız bir nümunə tapmadım.

Yalnız bir inkişaf etdiricisinizsə, açıq şəkildə öz seçiminizi edə bilərsiniz, ancaq bir komanda olaraq işləsəniz ya bunları bildirməlisiniz:

Href = "#" istifadə edin, onclick -in sonunda həmişə false false yazdığından əmin olun, çağırılan hər hansı bir funksiya səhv salmır və onclick xüsusiyyətinə dinamik olaraq bir funksiya əlavə etsəniz, geri qaytarmadığınızdan əmin olun. yalan

İkincisi açıq şəkildə ünsiyyət qurmaq üçün daha asandır.

Həqiqi bir URL əldə edə bilsəniz, bunu HREF olaraq istifadə edin. Yeni bir nişan açmaq üçün bağlantınıza kimsə orta klik edərsə və ya JavaScript deaktivdirsə, onclick işə düşməz.

Bu mümkün deyilsə, heç olmasa çapa etiketini sənədə JavaScript və müvafiq klik hadisə işləyiciləri ilə daxil etməlisiniz.

Bunun hər zaman mümkün olmadığını başa düşürəm, amma fikrimcə, hər hansı bir ictimai veb saytın inkişaf etdirilməsi üçün səy göstərilməlidir.

& Lta ​​href = "#" onclick = "myJsFunc ()" & gtLink & lt/a & gt və & lta href = "javascript: void (0)" onclick = "myJsFunc ()" & gtLink & lt/a & gt və ya oncay atributu olan başqa hər şeyi etmək beş il əvvəl, indi də pis bir tətbiq ola bilər. Səbəbi budur:

Qorunması çətin və miqyası çətin olduğu ortaya çıxan maneəli JavaScript təcrübəsini təbliğ edir. Bu barədə daha ətraflı Gözəgörünməz JavaScript.

Vaxtınızı kod bazanıza çox az (əgər varsa) fayda verən inanılmaz dərəcədə çox açıq kod yazmağa sərf edirsiniz.

İstədiyiniz nəticəni əldə etməyin daha yaxşı, daha asan və daha davamlı və ölçeklenebilir yolları var.


Videoya baxın: Getting Started with ArcObjects in ArcGIS