Mål: Det framfår inte huruvida du redan har kartor i denna skala, och om det är därför du gör så. Om du vill ha ett transparent objekt som du dynamiskt projicerar över din ritning Tack för ditt svar Niklas. Tack för ditt svar Lars. Jag tycker att min lösning är tämligen enkel, själva "uppritningen av zoner" kommer bli besvärlig om man gör det på pixelnivå, och databasen kommer (som du själv skriver) fyllas med rejäla mängder information. Jag tror inte man kan låta en control vara semi transparent så att formulärets bakgrund "lyser" igenom. Vad gäller själva markeringen av zoner så tror jag att det kommer bli enkelt vare sig jag skulle bygga grunden vektor baserad eller från fasta pixlar, då man endast tar start position x & y och slut position x & y, det bildar ju en kvadrat/rektangel. Alternativt som du nämde innan, markera punkter som tillslut bildar en polygon. Så denna del av utvecklingen är jag relativt bekväm med. Det var ju en smart ide faktiskt angående två fönster... Det skulle funka och jag tror det går att snygga till med lite pyssel... Tack! Jag menar (ang. vektorbaseringen) att det vore smutt om man kunde lagra själva bakgrundsritningen Ja det skulle vara grymt om man kunde det, och om jag får detta att fungera som tänkt så kommer jag köra vidare med andra byggnader, så att man måste bygga allt från scratch är inte så dumt om man tänker långsiktigt. Om man vänder på det, man måste ju göra om mycket åndå om man har en statisk bakgrund... tja CAD kontroll är det ju inte men WPF (.net 3.0) är ju vektorgrafik per default. <b>>..men jag kanske är fel ute. Kan du beskriva lite mer hur du skulle gå tillväga?</b>Zon indela skalenlig ritning...
Att kunna zon indela en skalenlig ritning via musklick(delge ett värde 0-29) för att sedan få % satsen per indelad zon av den totala arean. Det finns en total kostnad att driva byggnaden + hyra som jag sedan vill dela upp med % satserna.
Förutsättningar:
En skalenlig ritning där en pixel motsvarar en dm2. Ritningen och de olika zon indelningarna måste kunna visas samtidigt, tex ritningen i bakrunden och zonerna med en viss färg med 50% genomskinlighet. Byggnaden är dock öven 165 meter lång och 110 meter bred. Jag har valt att använda dm2 då samtliga väggar, stolpar och andra föremål i byggnaden är placerade på dm nivå... Om jag väljer m2 kan feldifferansen att vara för stor, dvs % satserna så fel att det har för stor inverkan på kostnads fördelningen...
Problem:
Jag har brainstormat ett bra tag nu men vet inte ännu vilken huvud rikting jag ska ta... Vi snackar ju över 1,8 miljoner rutor (pixlar) som skall kunna delges ett värde och de måste kunna sparas och hämtas från en databas. Dessutom måste ju som sagt zonera visas med viss genomskinlighet och en specifik färg så ritningen syns i bakrunden vilket jag inte lyckats med tidigare...
Jag har snabbt byggt en liten applikation i VB.NET som kan rita en pixel med en viss färg på ritningen (dock inte med genomskinlighet), jag har också pixel kordinaterna där användaren klickat, x och y vilket kan motsvara ett ID i en databas(tex 120:210). Jag har dock inte börjat med databas hanteringen då jag inte bestämt mig för vilken databas typ att använda, kanske en txt fil? SQL eller Access? ..ja vet inte..
Jag vet heller inte om värderna ska sparas direkt vid MouseUp eventet eller när användaren väljer att spara, jag tänkte välja det som är minst prestanda krävande.
(Jag kommer förmodligen senare bygga en funktion där användaren kan markera ett område och inte bara en ruta/pixel för användavänlighetens skull.. men det är enkelt och inte prioriterat nu.)
Jag behöver en "kick-start", någon som har en bra idé/koncept i stort hur detta skulle kunna genomföras.
Tack på förhand.
/// ChristofferSv: Zon indela skalenlig ritning...
Annars är det lämpligaste att definiera kartan i ett vektorformat och då välja precis vilken skala som helst.
Jag skulle ha grundlösning enligt följande:
1. Definiera zoner som polygoner, dvs ett antal punkter.
2. Vid klick omvandlar du muskoordinaten till en "världspunkt" (alltså i rätt skala).
3. Ett antal klick kopplar du till en viss zon. Vad du har för lagring är väl av mindre betydelse.
4. Ur polygonerna kan du nu lätt få areor.
Jag skulle lösa detta först och manuellt, min åsikt är att detta är den viktigaste och svåraste delen. Sen att få dit lite bilder och transparens och krafs är sånt man kan fixa i efterhand.Sv: Zon indela skalenlig ritning...
vid t. ex. mousemove, så blir det nog till att rita ut den m.h.a. Graphics-objektet.
dvs. du får alphablenda ihop bilderna till en ny bild som läggs in i den control
som ska visa bilden ( typ: picturebox)
Uppdateringar kan förslagsvis göras vid onpaint och onmousemove händelser.
surfa på: alphablending dot.netSv:Zon indela skalenlig ritning...
Jag har en karta där en pixel motsvarar en dm2. Har dock ritningen i CAD format så jag kan iprincip omvandla den hur jag vill... Byggnaden är mest öppna ytor men finns även ett antal rum och ett flertal andra objekt som måste tas med i beräkningen, dom är fasta och placerade i en "dm2 grid" från början.
Det ända applikationen ska göra är att kunna visa areor/zoner (ovanpå en ritning) som har tilldelats ett värde och räkna ut hur stor del av den totala arean respektive värde utgör. Zonerna behöver endast kunna markeras som tetragoner(fyrhörningar).
Din lösning låter dock väldigt lockande i den bemärkelsen att, teoretiskt kan man då definera vilken yta som helst, som man sedan kan markera zoner i. Alltså man hårdkodar inte de yttre måtten och bygger allt från scratch. Känns dock som ett mycke större projekt än vad jag egentligen behöver, eller har jag möjligen missuppfattat dig?
/// ChristofferSv:Zon indela skalenlig ritning...
Jag kommer (som det ser ut nu) alltså att ha en bakrundsbild som visar byggnaden med dess väggar och andra objekt. Sedan kommer jag att ha en exakt lika stor PictureBox ovanpå som användaren "ritar" pixlar (=markerar ett dm2 stora områden) med en viss färg (som symboliserar ett värde). Bilder som ligger ovanpå måste alltså vara en viss % genomskinlig så man fortfarande ser ritningen bakom.
Jag ska kolla in "alphablending dot.net". Tack för tipset. Har försökt med detta i VB6 förut i ett annat projekt men gav upp.. Måste ge det en ny chans nu i .NET tror jag.Sv: Zon indela skalenlig ritning...
Men jag kanske missförstod, vill du bara göra detta en gång?
Gör det då direkt i CAD, då får du fram areorna superenkelt.Sv: Zon indela skalenlig ritning...
En riktig fuling om du nu prompt vill undvika GDI:andet, skulle kanske kunna vara att jobba med 2 formulär där det ena är transparent och utan ram.(bit ugly though)
angående zonerna:
Du sa att du hade ritningen i CAD format,
finns det nån chans att få fram data ur detta så att både ritningen och din valda zoner
kan jobba enligt samma vektoriserade protokoll?
Detta måste väl vara allra bäst?
Sv:Zon indela skalenlig ritning...
Slut produkten är en ett verktyg som kan uppdateras hur/när som helst, dvs jag vill inte bara markera upp zonerna en gång. Bör kanske också nämna att en zon (ett antal rutor delgivna med samma värde) kan finnas på flera ställen inom ritningen, flera områden ska kunna markeras med samma värde.
Jag har aldrig jobbat i VB med någon vektorbaserad lösning så det är väl kanske därför jag inte riktigt är med dig. Hur somhelst måste väl bilden(vektor eller vanlig pixel baserad) vara uppdelad i en "fiktiv grid", där En ruta är minimum användaren kan markera och delge ett värde+färg? Det är den förutsättningen jag utgått ifrån, därav tänkte jag att om en pixel representerar en dm2 får jag ju mycket gratis. Musens position är pixlar, och jag kan enkelt rita samma postion i pictureboxen...
...men jag kanske är fel ute. Kan du beskriva lite mer hur du skulle gå tillväga?Sv:Zon indela skalenlig ritning...
Angående vektorbaserade lösningen; Ja det är nog det bästa, även Niklas har föreslagit det men jag vet inte ens vart jag skulle börja.. Har aldrig jobbat med VB på det sättet.
Några tips att komma igång?Sv: Zon indela skalenlig ritning...
på samma sätt som du vill spara de egna zonerna, och inte bara använda ritningen som en statisk bakgrund. Då skulle du lätt kunna skala om rubbet (zooma in/ut) och vrida och vända på allt. Detta frågar du ju iofs. inte efter och innebär fortfarande att man får rita ut rubbet.
Det borde finnas nån CAD-control till dot.net som har efterfrågad funktionalitet,
frågan är bara priset?
Sv:Zon indela skalenlig ritning...
Jag ska kolla om det finns, men antar att det kostar några kronor... Tack för tipset!
Jag har börjat labbat nu med en 50x50 pixlar test bild, som jag mappar mot en txt fil med semicolon som separator, tex så här;
(fast då 50x50 men jag kände att jag inte behövde rita upp alla här...)
0;0;0;0;0
0;0;0;0;0
1;1;1;0;0
0;0;1;0;0
0;0;1;0;0
...vi får se hur det går.Sv:Zon indela skalenlig ritning...
Sv: Zon indela skalenlig ritning...
1. Jag skulle ha en SQLite-databas med tabeller:
Zone
-----
ID
Name
...
Polygon
-----
ZoneID
Order
X
Y
Där "Order" är i vilken ordning punkterna är utritade. Utöver det skulle jag skapa en view som ger Area per zon:
ZoneAreas
-----
ZoneId
ZoneName
Area
Sen kan man ju eventuellt koppla zoner till företag etc. Den mest intressanta ändringen vore att definiera punkterna i en egen tabell (så att det aldrig uppstår tomma ytor). Med tiden kan man ju även lägga till möjlighet att koppla varje punkt osv till separata fastigheter, där man också sparar deras kartor.
Det svåra här är att göra Area-funktionen. Har för mig att det finns en ganska enkel funktion för det.
2. Sen skulle jag i något programspråk med något bibliotek (jag skulle nog inte köra .NET öht, men det spelar ju ingen roll) slänga upp någon form av rityta. Utöver ritytan skulle jag lägga in variabler för åtminstone zoom och translation (t.ex. en transform). Sen skulle jag börja titta på musklick i ritytan. Klicken skulle naturligtvis hamna på pixelnivå, men det är superenkelt att först omvandla dem till [0,1] för att visa var i själva rutan man pekade.
Sen översätter man koordinaterna för varje musklick till den koordinat i "världen" som musklicket motsvarade. Utöver detta skulle man kunna lägga in en liten skala i ett av hörnen.
3. Genom att registrera en rad punkter skulle jag sen skicka dem till tabellen i databasen och kolla att arean verkar vettig.
För att kolla att allt står rätt till skulle jag först skapa en funktion som omvandlar från en världskoordinat tillbaks till en pixelkoordinat, hämta alla punkter och rita ut en punkt för varje pixel. Om det ser rätt ut, och beter sig korrekt efter skalning etc. kan man sen börja med "krafset".
4. Först kan man börja med med att dra linjer mellan koordinaternas punkter, för att verkligen se polygonerna. Sen kan man lägga till polygonfyllning, något de flesta bibliotek har. Det går att göra rätt snajsigt, med en färg på kanten, en färg inuti. Det är dessutom inga problem att göra det antialiased, vilket gör det jävligt snyggt. Lägg in färgväljare, och koppla ev. färgen till tabellen.
Prova även det med skalningen och translationen, och släng dessutom in lite bra funktioner för det (zoom med zoomhjulet, ha en "hand" ála Acrobat m.fl, osv.). Lägg också till funktionalitet för att ta tag i punkter och flytta.
5. När allt beter sig rätt är det dags att se till att få det att bli användbart. Ta fram bilden, rita ut aktuell del av den i ritytan. Eftersom det är möjligt: se till att ha den i ett vektorformat, och skala och translera den rätt.
6. Till sist skulle jag sen till att det övre lagret, med polygonerna, blir halvtransparent. I min värld skulle det vara det minsta problemet, det är ju bara att se till att skapa funktionaliteten på något sätt och sen låta koden gå mot rätt typ av yta så är det klart.
Problemet med att göra som du gör nu är att du kommer tappa en hel del flexibilitet om du inte kan zooma, du kommer göra vansinnigt stora filer för att spara informationen. Därmed har du också rätt stor risk att uppritningen kommer ta jävligt lång tid. Det är därför polygoner är bättre, bara några byte per hörnpunkt i polygonen, istället för varje enskild punkt.