Daha çox

Niyə bu şərhlər üst-üstə düşür / üst-üstə düşür?


Proqramlaşdırma şəklində bir şərh xüsusiyyətini doldurmağa çalışarkən qəribə bir problemlə qarşılaşdım (ArcObjects, C #). Aşağıdakı şəkildə gördüyünüz kimi, hər bir mətn sətrindəki simvollar gözlədiyim kimi üfüqi düzülüş yerinə bir-birinin üstünə yığılır.

MySQL-dən bir neçə dəyər götürürəm (fərqli bir tətbiqetmə tərəfindən yaradılıb) və bunlar ayıklayıcıda yaxşı görünür. Bilinməyən / proqnozlaşdırılan koordinat sisteminin qarışığından və bir neçə fərqli Element interfeysindən istifadə etməyə çalışdım. Əgər kimsə əvvəllər bu məsələni görsə və düşünsəydi, əminəm ki, düzgün istiqamətdə bir təkan verəcəyəm.

Budur, C # sənədimin müvafiq hissəsi:

IFeature xüsusiyyət = featureClass.CreateFeature (); ITextElement textElement = yeni TextElementClass (); textElement.Text = textString; // kimi dəyər: '183 IElement element = textElement IElement kimi; element.Geometry = pointGeom; // Nöqtə: x = 2986785, y = 629058 (IAnnotationFeature2 kimi xüsusiyyət) .Annotation = element; (IAnnotationFeature2 kimi xüsusiyyət) .AnnotationClassID = 0; (IAnnotationFeature2 kimi xüsusiyyət) .Status = annoStatus; // 0 üçün ESRI sabit, "yerləşdirilmiş" xüsusiyyət.Store ();

Və söz verdiyi kimi, əldə etdiyim nəticələrə nəzər salaq:

[Yeniləmə]

Per @ Radarın tövsiyəsi ilə aşağıdakı düzəlişləri sınadım, lakin yenə də üst-üstə qoyulmuş / üst-üstə qoyulmuş izahat mətnini təqdim edir:

ISymbolCollectionElement scElement = yeni TextElementClass (); scElement.CharacterSpacing = 5; scElement.Geometry = pointGeom; scElement.Text = textString; (IAnnotationFeature2 kimi xüsusiyyət) .Annotation = scElement IElement kimi; (IAnnotationFeature2 kimi feat) .AnnotationClassID = 0; (IAnnotationFeature2 kimi feat) .Status = annoStatus;

Hər kəsin əlavə fikirləri var?

[İkinci Yeniləmə]

Əsasən @murdoch-un bu "köhnə" ArcScripts postunda etdiklərini həyata keçirməyə çalışıram (ikinci girişinə bax). Yenidən yanaşmasını nəzərdən keçirdim və IFormattedTextSymbol interfeysindən istifadə etdiyini gördüm, buna görə çalışdım, amma yerləşdirilmiş şərhlərdə yığılmış / üst-üstə düşən mətnlə eyni problemi yaşamağa davam edirəm. Budur, C # -yə ən son həvəsim:

IFeature xüsusiyyət = featureClass.CreateFeature (); IFontDisp font = yeni StdFontClass () IFontDisp olaraq; font.Name = "Arial"; font.Bold = true; // font.Size = 30; // bəzi məqbul standart dəyərlərə yükləyin ... IFormattedTextSymbol fmtTextSymb = yeni TextSymbolClass (); fmtTextSymb.Font = şrift; fmtTextSymb.Size = 30; fmtTextSymb.VerticalAlignment = esriTextVerticalAlignment.esriTVABottom; fmtTextSymb.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft; fmtTextSymb.Angle = 0; fmtTextSymb.CharacterSpacing = 100; fmtTextSymb.CharacterWidth = 100; fmtTextSymb.FlipAngle = 90; fmtTextSymb.Leading = 0; fmtTextSymb.WordSpacing = 100; fmtTextSymb.Text = textString; // xüsusi mətn dəyərim ... ITextElement textElement = yeni TextElementClass (); textElement.Symbol = fmtTextSymb; textElement.Text = textString; IElement elementi = IElement kimi textElement; element.Geometriya = pt; (IAnnotationFeature2 kimi xüsusiyyət) .Annotation = element; xüsusiyyət.Store ();

Hər kəs bununla bağlı məsələni həll edir? və ya üstünlük verilən bir tətbiq varmı? Budur indi necə görünür; Gördüyünüz kimi yanaşma bir qədər dəyişdi, amma nəticələr eynidir:

[Üçüncü yeniləmə]

Son təhlildə problem fərdi izahat yaratmaq üçün istifadə etdiyim kodda deyildi, ancaq @Kirk Kuykendall'ın açıqladığı kimi, problem AnnotationLayer-i əvvəlcə necə yaratdığımda idiIAnnotationLayerFactory.CreateAnnotationLayer (). Təqdim edirdimsıfırüçünIGraphicsLayerScalearqument, funksional, çirkin olmasa da, standart dəyərləri həll edəcəyini düşünsək. Göründüyü kimi deyil. O obyekti aşağıdakı kimi yaratdım və problemimi həll etdi:

// Xəritə ölçüsünü və annosların "bişməsi" lazım olan vahidləri seçin. // ReferenceScale əldə etmək üçün ArcMap'ı açın və uyğun bir səviyyəyə gətirin. // Standart alətlər panelində 1: N düyməsini vurun (ucunda "MapScale" yazılır). // 1: 1200 kimi bir şey çıxaracaq. 1: və vergül // işarələrini buraxın və ReferenceScale üçün istədiyiniz dəyər budur. IGraphicsLayerScale graphicsLayerScale = yeni GraphicsLayerScaleClass (); graphicsLayerScale.ReferenceScale = 1200; graphicsLayerScale.Units = esriUnits.esriFeet; // bu proyektinizlə razılaşmalıdır

Voila!


Arccatalog 10 sp2-dən istifadə edərək veb merkator proyeksiyası, xy toleransı 0.001, istinad ölçüsü 1: 100.000, xəritə vahidləri ilə yeni (xüsusi əlaqələndirilməmiş) bir izahat sinfi yaratdım.

"Simvol cədvəlindən simvolun seçilməsini tələb edin" yoxlamadı. Qalanlar üçün bütün defoltları qəbul etdi.

Daha sonra arcmap-a girdim və əl ilə əlavə edə bildim, sonra bu kodu heç bir üst-üstə düşən problem olmadan işlətdim.

ümumi sinif TestButton: ESRI.ArcGIS.Desktop.AddIns.Button {public TestButton () {} qorunan ləğv void OnClick () {cəhd edin {Test (); } tutmaq (Exc ex ex) {MessageBox.Show (ex.Message); }} qorunan ləğv void OnUpdate () {} public void Test () {var editor = ArcMap.Application.FindExtensionByName ("ESRI Object Editor") IEditor; if (editor.EditState! = esriEditState.esriStateEditing) {MessageBox.Show ("əvvəl redaktə etməyə başlayın"); qayıtmaq; } var fLayer = ((IEditLayers) redaktoru) .CurrentLayer; if (! (fLayer IAnnotationLayer)) {MessageBox.Show ("anno qat deyil"); qayıtmaq; } var pnt = ((IArea) ArcMap.Document.ActiveView.Extent) .Centroid; string s = Environment.TickCount.ToString (); cəhd edin {editor.StartOperation (); AddAnno (fLayer.FeatureClass, pnt, s); editor.StopOperation ("ekranın mərkəzinə əlavə et"); ArcMap.Document.ActiveView.Refresh (); } tutmaq {editor.AbortOperation (); atmaq; }} xüsusi boşluq AddAnno (IFeatureClass featClass, IPoint pt, string textString) {IFeature xüsusiyyət = featClass.CreateFeature (); var annoClass = featClass.Extension kimi IAnnoClass; IFontDisp font = yeni StdFontClass () IFontDisp olaraq; font.Name = "Arial"; font.Bold = true; // font.Size = 30; // bəzi məqbul standart dəyərlərə yükləyin ... IFormattedTextSymbol fmtTextSymb = yeni TextSymbolClass (); fmtTextSymb.Font = şrift; fmtTextSymb.Size = 30; fmtTextSymb.VerticalAlignment = esriTextVerticalAlignment.esriTVABottom; fmtTextSymb.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft; fmtTextSymb.Angle = 0; fmtTextSymb.CharacterSpacing = 100; fmtTextSymb.CharacterWidth = 100; fmtTextSymb.FlipAngle = 90; fmtTextSymb.Leading = 0; fmtTextSymb.WordSpacing = 100; fmtTextSymb.Text = textString; // xüsusi mətn dəyərim ... ITextElement textElement = yeni TextElementClass (); textElement.Symbol = fmtTextSymb; textElement.Text = textString; IElement elementi = IElement kimi textElement; element.Geometriya = pt; (IAnnotationFeature2 kimi xüsusiyyət) .Annotation = element; xüsusiyyət.Store (); }}

ISymbolCollectionElement istifadə edərək, simvol aralığı kimi xüsusiyyətlər təyin etməyə imkan verəcəkdir.

Bu məqalədə təsvir etdiyiniz problemin qarşısını almaq üçün bir mətn elementindən istifadə edərək necə yanaşmalı olduğunuz izah olunur.

"Bir TextElement istifadə olunursa, ISymbolCollectionElement interfeysindən istifadə edərək AnnotationFeatureClassExtension-un SymbolCollection-da saxlanılan mövcud TextSymbol-a istinad edə bilərsiniz. TextElements-i bir şərh xüsusiyyətində saxlayarkən SymbolCollection-dakı simvollara müraciət etməyiniz tövsiyə olunur. Bu saxlama sistemi haqqında daha ətraflı məlumat üçün ISymbolCollectionElement. "

"ISymbolCollectionElement, Geodatabase Annotation Feature Classların bir hissəsi olaraq SymbolCollection-da saxlanılan TextSymbollara istinad edən TextElements xüsusiyyətlərinə giriş təmin edir. TextElements izahat xüsusiyyətlərini redaktə edərkən, SymbolCollection simvolu ilə əlaqəni qorumaq üçün bu interfeysin istifadəsi vacibdir. ITextElement :: Symbol vasitəsilə simvol xüsusiyyətlərinə daxil olmaq və yeniləmək TextElementin SymbolCollection simvolundan ayrılmasına səbəb olacaq və simvol xüsusiyyət sinifindəki xüsusiyyət ilə satırda saxlanacaqdır. TextSymbols böyük ölçüdə ola biləcəyi üçün bu arzuolunmazdır. "

Düzəlişlərinizə müraciət olunur. Cəhd edin:

ISymbolCollectionElement scElement = yeni TextElementClass (); scElement.CharacterSpacing = 5; scElement.Geometry = pointGeom; scElement.Text = textString; (IAnnotationFeature2 kimi xüsusiyyət) .Annotation = scElement; (IAnnotationFeature2 kimi feat) .AnnotationClassID = 0; (IAnnotationFeature2 kimi feat) .Status = annoStatus;


Videoya baxın: شرح ادراج ملاحظات على شرائح البوربوينت لا يشاهدها الا مقدم العرض (Sentyabr 2021).