Showing posts with label Kodning. Show all posts
Showing posts with label Kodning. Show all posts

Saturday, September 11, 2010

Balloon Callout i ArcGIS Engine.

Anpassat ett exempel i VBA dokumentationen "How to add balloon callout" så att den fungerar i ArcGIS Engine. Inga stora förändringar krävdes utan det räckte med att byta ut så att ActiveView inte hämtas via MxDocument utan MapControl. Bryter man dessutom ut ActiveView till att vara en inparameter så fungerar dessutom exemplet i både desktop och engine.

 Private Sub AddBalloonCallout(ByVal activeView As IActiveView)  
Dim pTextElement As ITextElement
Dim pElement As IElement
Dim pPoint As IPoint
Dim pCallout As ICallout
Dim pTextSymbol As IFormattedTextSymbol
Dim pGraphicsContainer As IGraphicsContainer
Dim midX As Double, midY As Double
'Create a new text element
pTextElement = New TextElement
pElement = CType(pTextElement, IElement) 'QI
pTextElement.Text = "Text callout" & vbCrLf & "In the middle of the screen"
'Position the new element on the active view's center point
midX = (activeView.Extent.XMax + activeView.Extent.XMin) / 2
midY = (activeView.Extent.YMax + activeView.Extent.YMin) / 2
pPoint = New Point
pPoint.PutCoords(midX, midY)
pElement.Geometry = pPoint
'Set the text element symbology to a default balloon callout
pTextSymbol = New TextSymbol
pCallout = New BalloonCallout
pTextSymbol.Background = CType(pCallout, ITextBackground)
'Use this formula to get a callout anchor point location
pPoint.PutCoords(midX - activeView.Extent.Width / 4, midY + activeView.Extent.Width / 20)
pCallout.AnchorPoint = pPoint
pTextElement.Symbol = pTextSymbol
'Add the element to the active view, either the focus Map or PageLayout
pGraphicsContainer = CType(activeView, IGraphicsContainer)
pGraphicsContainer.AddElement(pElement, 0)
pElement.Activate(activeView.ScreenDisplay)
'Flag the area of the new element for refreshing
activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pElement, Nothing)
End Sub

Wednesday, August 25, 2010

Skapat verktyg med IDisplayFeedback.

Vi har problem med standard mätverktyget i ArcGIS engine. Bug in ControlMapMeasureTool? “Measure An Area” creates a duplicate dialog in ArcGIS Engine 10 Så jag har suttit efter tips från Kirk och labbat lite hur man kan skapa egna verktyg med IDisplayFeedback. Hittade ett bra exempel Sample: Custom subtyped command and tool som visade hur man ska göra. Skapar man en ny verktygsklass, så kan man överlagra på det här sättet för att få ett verktyg som mäter areal:

 Private m_polygonFeedback As INewPolygonFeedback  
Private m_screenDisplay As IScreenDisplay

Private m_hookHelper As IHookHelper


Public Overrides Sub OnCreate(ByVal hook As Object)
If (m_hookHelper Is Nothing) Then m_hookHelper = New HookHelperClass

If Not hook Is Nothing Then
m_hookHelper.Hook = hook
End If
End Sub

Public Overrides Sub OnClick()
m_screenDisplay = m_hookHelper.ActiveView.ScreenDisplay
End Sub

Public Overrides Sub OnDblClick()
Dim polygon As IPolygon = m_polygonFeedback.Stop()
MsgBox("Area: " & CType(polygon, IArea).Area)
m_polygonFeedback = Nothing
End Sub

Public Overrides Sub OnMouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
If Button = 1 Then
Dim cursorPoint As ESRI.ArcGIS.Geometry.IPoint = m_screenDisplay.DisplayTransformation.ToMapPoint(X, Y)

If m_polygonFeedback Is Nothing Then
m_polygonFeedback = New NewPolygonFeedbackClass()
m_polygonFeedback.Display = m_screenDisplay

m_polygonFeedback.Start(cursorPoint)
Else
m_polygonFeedback.AddPoint(cursorPoint)
End If

End If
End Sub

Public Overrides Sub OnMouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
If Not m_polygonFeedback Is Nothing Then
Dim cursorPoint As ESRI.ArcGIS.Geometry.IPoint = m_screenDisplay.DisplayTransformation.ToMapPoint(X, Y)
m_polygonFeedback.MoveTo(cursorPoint)
End If
End Sub

Thursday, May 27, 2010

Run VS as administrator.

När man kör Visual Studio (VS) i Windows 7 (Win7), så är det bra att ställa in så att man kör den som administratör eftersom man i annat fall kan få fel i VS. Detta pga att processen körs med för hög säkerhet. Istället för att varje gång komma ihåg att högerklicka och välja "run as administrator" så kan man välja "egenskaper"


och "Advanced" och klicka i "run as admininstrator"




så startas VS alltid med administrator rättigheter.

Wednesday, May 05, 2010

Slå ihop PDF filer med iTextSharp.

Fick en fråga om jag kunde lägga till en sida med text i en rapport som vi genererar via reporting services. Och visst kan man det men då kommer man bli tvungen att underhålla en sida med text via rapporten vilket inte känns så bra. Ett annat alternativ som kändes mer lockande var att kombinera ihop PDF:en som skapas från reporting services med text sidan som en PDF. Så att dom kan underhållas var för sig.

Testade att skapa en applikation för att slå ihop två PDF:er och använde iText# som vi använder i andra projekt och utnyttjade ett exempel som jag hittade på nätet: http://khsw.blogspot.com/2006/04/merge-pdf-files-using-itextsharp.html gjorde enklast möjliga kod:

Dim destination As String = "c:\\testPDF.pdf"

Dim source As List(Of String) = New List(Of String)

source.Add("c:\\1.pdf")
source.Add("c:\\2.pdf")

PdfMerge.MergeFiles(destination, source.ToArray())

Fungerar hur bra som helst!

Saturday, April 17, 2010

Public Resource.resx

Lade till en Resource.resx fil i ett av mina projekt och försökte komma åt ResoureManager objektet från en annat projekt, men fick ett kompileringsfel. :( Det visade sig att VS standardmässigt skapar resursfiler som Internal/Friend isf Public, vilket gör att klasserna bara går att komma åt internt i samma assembly. Detta går att lösa genom att hacka i den automatgenererade koden men det är ajjabajja , det vill man inte göra. Visar sig att det går att byta custom tool som skapar koden, vilket är en bättre lösning:

Byt från ResXCodeFileGenerator till PublicResXFileCodeGenerator så får man en resurs klass som är public.

Saturday, February 20, 2010

Combobox i verktygsfält i ArcGIS Engine eller implementera IToolControl.

När man bygger verktyg för ArcGIS Engines verktygsfält, så kan man utgå från dom templates som installeras i visual studio enligt konceptet som finns beskrivet här: http://resources.esri.com/help/9.3/ArcGISEngine/dotnet/0bf044f6-dbcd-4d04-836e-3b5e47204818.htm.
Men ibland så vill man ju ibland göra lite mer avancerade saker. T.ex så kan man vara i behov av att lägga in en combobox i verktygsfältet. För att få det att fungera så krävs det lite mer kodning, man måste implementerar interfacet ICommand eller ITool (ifall man vill ha ett verktyg med tillgång till displayen) istället för basklasserna. Samt ärva från en System.Windows.Form.Combobox. Utöver detta så krävs det även att man implementerar interfacet IToolControl se http://resources.esri.com/help/9.3/ArcGISEngine/arcobjects/esrisystemui/itoolcontrol.htm. Esri beskriver här hur man måste göra för att knyta kontrollen till verktygsfältet. Handle referensen till comboboxen måste exponeras vid implemenation av interfacet.

Thursday, November 19, 2009

Spara "sessionsvariabler" i WCF.

I vår loggninglösning så sparas SessionsID och Användarnamn och propageras mellan tjänster så att man kan hålla ihop anrop från en klient till underliggande tjänster. Dessa sparas som sessionsvariabler i ASP.Net och som static variabler i windows applikationer.

I ASP.Net så är det lätt att spara undan variabler i en session genom att spara i den collection som finns t.ex i Page objektet:
page.Session["SessionID"] = session.ToString();

Men i WCF är det inte lika lätt att se hur man sparar undan variabler. Detta beror till stor del på att WCF är gjort för att vara mer generellt och klara olika typer av underliggande tekniker. Man får läsa på en del innan man förstår hur det hänger ihop, här finns en bra beskrivning av InstanceContextMode:
http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

Lösningen på problemet fann jag här: http://blogs.msdn.com/drnick/archive/2007/02/15/stashing-data-in-extensible-objects.aspx genom att skapa ett ExtensionObjekt som lagras på InstanceContext så uppnådde jag samma funktionalitet som tidigare i ASP.Net, dvs sessionsvariablen lever under anropets tid.

if (OperationContext.Current.InstanceContext.Extensions.Find() == null)
{
OperationContext.Current.InstanceContext.Extensions.Add(new SessionMessageInstanceContext());
}
OperationContext.Current.InstanceContext.Extensions.Find().ServiceCallCounter++;

Saturday, October 10, 2009

Introduktion till .Net 4.0

Oj, oj nu blev det tätt mellan blogginläggen men jag har även kollat på denna presentation som jag tycker var bra: http://www.msdev.com/Directory/Description.aspx?eventId=1271

Installation
Side-by-side, fungerar med tidigare versioner.

Dynamiska språk

IronPython, IronRuby, Nytt i .Net 4.0 är Dynamic Language Runtime, Ligger som ett lager ovan på CLR

C#

Named parameters

  • Lägga parametrar i olika ordning
  • Default värde
  • Optional parameters

VB.Net

Multi-line Lambda

F#

Nytt språk, som kommer. Funktionellt språk som innebär att man beskriver vad man ska gör i större grad än hur man vill att datorn ska exekvera. Ett steg längre ifrån hårdvaran.

MEF
Plug-In ramverk för Applikationer

  • Attribut för Import, Export
  • CompositionContainer, Catalog
  • System.System.CompositionModel.Composition för Hosting

Threads

  • CountDown Events
  • Barriers
  • Ger möjlighet att vänta in delprocesser

CodeContract

Assert i all ära men här kommer det som chefen vill att man ska göra, dvs beskriva vad gränssnitten stöder och på så sätt få bättre kvalité på koden.

  • System.Diagnostics.contracts
  • PreConditions
  • PostConditions
  • Invariants

.Net 4.0 och Visual Studio 2010.

Sprang på en presentation som Scott Guthrie http://channel9.msdn.com/posts/matthijs/Scott-Guthrie-Visual-Studio-2010-and-NET-Framework-40/ gjort om .Net 4.0 och VS2010. Intressant en och halvtimmes genomgång av "vissa delar" som kommer i VS2010. Några grejer som fastnade...
Fokus på att läsa och hitta i kod:
  • Markerar parametrar, så "highlightas" parametrarna i koden.
  • intellisence, sökbar med regexp, behöver inte vara objekt namn eller metod namn... Sök på en del av ett metodnamn så kommer namnen som matchas upp. Fungerar även med camelCase,dvs heter metoden GetParameterValue så går det att söka på GPV.
  • Ctrl - Shift - I, snabb sökning. Visar alla ställen i koden då
  • Call Hirarchy. Visar varifrån en metod anropas.

Debug History

  • Möjlighet att gå tillbaka och se värden på variabler mm.
  • Göra en dump av debug history i felhanteringen, och på så sätt få tillbaka läget som kunden eller testaren hade vid fel tillfället! Detta borde vara alla utvecklares våta dröm :)

web platform installer

IIS SEO Toolkit

  • Produkt för att kolla upp felaktigheter i dina siter som gör att du hamnar lågt i sökmotorerna sökningar.
  • http://www.iis.net/extensions/SEOToolkit
  • Installeras på en klient så man bheöver inte skräpa ned servern.
  • Fungerade både mot IIS6 och IIS7.

Customized config

VS2010 skapar som standardmässigt två anpassade configfiler Debug och Release (Ifall man valt att skapa projekt för 4.0). dessa innehåller kod för förändringar som krävs av web.config till Debug resp Release så har man conscction parametrar mm i web configen så får man ett ställ där man kan byta ut dessa. Tidigare han man varit tvungen att hacka detta i msbuild eller ha olika configfiler som länkats med i bygget.

Thursday, September 17, 2009

F# funktionellt språk från Microsoft.

Hittade igår en bra show som jag kollat på http://channel9.msdn.com/pdc2008/TL11/ som beskriver hur man använder F# på riktigt. Om jag förstått det hela rätt så är grejen att man beskriver vad man vill göra istället för hur datorn ska utföra det man vill att den ska göra (Imperativt C#, VB.Net). Dvs man kan skala bort mycket av den logik som man t.ex. i C# använder för att beskriva flödet datat ska ta i en applikation for, if else... Istället beskriver man vad man vill göra med informationen. Detta är extremt bra när man vill exekvera saker parallellt och asynkront, annars krävs en väldigt stor mängd kod för att göra och kontrollera anropen så dom blir parallella och asynkrona. F# verkar ha tagit syntaxen från OCml och fått tillgång till .Net ramverkets klassbibliotek. Språket verkar extremt kraftfullt, största problemet blir nog att lära sig tänka rätt. http://msdn.microsoft.com/sv-se/fsharp/default(en-us).aspx

Tuesday, August 18, 2009

Replikering av geodatabase i ArcSDE.

Har suttit och läst igenom hur man sätter upp och replikerar geodatabaser i ESRI ArcSDE. Mycket bra kapitel om detta finns här:
http://webhelp.esri.com/arcgisdesktop/9.3/index.cfm?TopicName=Understanding_distributed_data
Verkar finnas några om och men som är viktiga att komma ihåg att man måste ha en ArcSDE som parent och child om det ska gå att sätta upp en en- och tvåvägs-replikering, annars så fungerar det bara att ha en checkout replikering. Sen trycker dom på att man ska ha koll på sitt senario gång på gång i texten, så jag antar att det kan bli struligt om man vill byta replikeringsmetod i efterhand.

Har även kollat upp hur man i ArcObjects kan trigga igång en synkronisering och det verkar vara busenkelt: http://resources.esri.com/help/9.3/ArcGISDesktop/dotnet/8280cca2-b4cf-4d37-8b28-4ee02aaf37e5.htm