Examensarbete 10 poäng C-nivå APPLIKATIONSUTVECKLING TILL 3D CAD Reg.kod: Oru-Te-EXD083-D103/04 Kristina Fredriksson och Helena Lindberg Dataingenjörsprogrammet 120 p Örebro vårterminen 2004 Examinator: Jack Pencz APPLICATION DEVELOPMENT FOR 3D CAD Örebro universitet Örebro University Institutionen för teknik Department of technology 701 82 Örebro SE-701 82 Örebro, Sweden
Sammanfattning Den här rapporten beskriver ett examensarbete på 10 poäng inom Dataingenjörsprogrammet vid Örebro universitet. Arbetet är utfört för företaget CADCAM-it AB i Gävle. Arbetet gick ut på att skapa en applikation som gör det lättare och effektivare att rita upp byggnader i Autodesk Inventor. Arbetet resulterade i två program, det ena ritar upp en rektangulär byggnad från mått som anges i ett formulär, det andra ritar en byggnad med utgångspunkt från en måttsatt skiss i Autodesk Inventor. Abstract This report describes a degree project within the Computer Engineering Programme at Örebro University. The work was made for CADCAM-it AB in Gävle during 10 weeks in the spring term 2004. The aim was to create an application that makes it easier and more efficient when drawing buildings in Autodesk Inventor. The result was two applications, one where the building dimensions are given in a form for drawing square buildings and one that draws a building starting from a sketch in Autodesk Inventor. 1(23)
Förord Den här rapporten är resultatet av vårt 10 poängs examensarbete under våren 2004. Arbetet har utförts för CADCAM-it AB i Gävle. Vi inledde arbetet med en tvådagars introduktion hos företaget. Arbetet har sedan utförts på distans vid Örebro Universitet med handledning via mail och telefon av Johannes Lundgren från företaget. Vår handledare vid Örebro universitet har varit Mathias Broxvall. Örebro den 14 juni 2004 Kristina Fredriksson Helena Lindberg 2(23)
Innehållsförteckning: 1 Inledning... 4 2 Metoder och verktyg... 5 2.1 API...5 2.2 Anpassning...6 2.3 Sammanställningsfiler i Inventor...7 3 Kravspecifikationer... 8 3.1 Grundapplikation där alla värden anges i ett formulär...8 3.1.1 Användargränssnittet... 8 3.1.2 Filstrukturen... 8 3.1.3 Lagring av värden... 9 3.2 Applikation där byggnaden skapas från en skiss...9 4 Genomförande... 10 4.1 Grundapplikation där alla värden anges i ett formulär...10 4.1.1 Användargränssnittet... 10 4.1.2 Filstruktur och lagring... 10 4.2 Applikation där byggnaden skapas från en skiss...12 5 Programmens uppbyggnad... 16 5.1 Grundapplikation där alla värden skrivs in av användaren...16 5.1.1 Moduler och funktioner... 17 5.2 Applikation där byggnaden skapas från en skiss...19 5.2.1 Moduler och funktioner... 20 6 Resultat och diskussion... 21 7 Referenser... 23 3(23)
1 Inledning Rapporten beskriver ett examensarbete på 10 poäng utfört för CADCAM-it AB i Gävle. Det är ett CAD/CAM-företag med ett tiotal anställda som säljer CADprodukter, ger utbildning och support, utför installationer, service och underhåll för programvarorna. De utvecklar också egna applikationer för kundanpassning av produkterna. Bakgrunden till examensarbetet är ett ökat behov av anpassade applikationer till 3D CAD nu när utvecklingen inom CAD-världen går från 2D till 3D. Till 2D CAD finns en mängd specialutvecklade applikationer för specifika ändamål. Företaget upplever också att det hos deras kunder finns en allmän önskan att kunna rita allt i samma system. Syftet med arbetet var att skapa en grund för en applikation som gör det lättare och effektivare att rita upp byggnader i Autodesk Inventor, fortsättningsvis kallat Inventor i denna rapport. Inventor är ett konstruktionsprogram för 3D som är utvecklat för elektronik och mekanik. Det finns moduler för rör och el i programmet, men inga för byggnader. Målet med uppgiften var att programmera en lättarbetad grundapplikation för att rita golv och ytterväggar i Inventor. Dessa ska sättas ihop till en byggnad som kan bestå av ett antal våningar. Applikationen ska bestå av funktioner för att definiera konstanta värden för exempelvis antal våningar, takhöjd, väggtjocklek mm. Det ska även vara möjligt att lägga till nya konstanta värden dynamiskt. Applikationen ska kunna byggas på med fristående moduler för att exempelvis skapa dörrar och fönster, samt även hantera en databas med standardkomponenter. 4(23)
2 Metoder och verktyg Arbetet har utförts i Windowsmiljö, med operativsystem Windows 2000, och som programutvecklingsverktyg har använts Visual Basic 6.0. Som referenslitteratur vid programmeringen har vi använt Sams Teach yourself Visual Basic 6 in 24 hours [1] och Sams Teach yourself more Visual Basic 6 in 21 days [2]. Vi har utvecklat applikationerna för Autodesk Inventor 8.0 och 7.0 med hjälp av dess Application Programming Interface (API). Till API:et finns en inbyggd hjälp, Autodesk Inventor API Programming Help [3]. Vi har också hämtat information från kompendierna Inside the Autodesk Inventor API [4] och 101 Ways to customize Autodesk Inventor [5], Autodesk University 2003. Dessutom har vi använt onlinereferenser från Autodesk Developer Center, http://www.autodesk.com/developinventor [6]. API:et använder Microsoft Component Model (COM specifikationen), ett protokoll för standardiserad kommunikation mellan olika program. Standarden tillåter att man som programmerare behandlar Inventor och dess enheter som objekt. 2.1 API API:et till Inventor 8.0 omfattar 668 objekt. Till varje objekt hör ett antal egenskaper, metoder, händelser och konstanter. Strukturen i API:et kan illustreras av Figur 1 nedan, som visar hierarkin hos en delmängd av objekten. För en fullständig beskrivning av objekthierarkin se hjälpen till Inventors API [3]. Överst i hierarkin finns applikationsobjektet genom vilket man kommer åt alla underliggande objekt. API:et innehåller samlingar (collections) som har färdiga metoder för att bland annat räkna och adressera objekten i en samling. Exempelvis innehåller samlingen Documents olika typer av dokument som t.ex. detaljdokument (PartDocument). Ett detaljdokument i Inventor beskriver en detalj i ritningen och innehåller i sin tur samlingar av skisser (Sketches) och egenskaper (Features) som kan vara av olika typer. En annan dokumenttyp i samlingen Documents är sammanställningsdokument (AssemblyDocument) som kan bestå av en eller flera detaljer eller delsammanställningar. Figur 1. Objekthierarkin i Autodesk Inventors API. 5(23)
2.2 Anpassning Inventor kan anpassas för individuella behov genom tillägg av funktioner eller automatisering av ofta förekommande operationer. Det finns flera olika generella metoder att anpassa Inventor. För en mer ingående genomgång av de metoder som här beskrivs se hjälpen till Inventors API [3]. Det finns följande generella metoder: 1. Interna VBA Projekt skapas inifrån Inventor med hjälp av det inbyggda Visual Basic for Applications (VBA). Detta är det enklaste och vanligaste sättet. 2. Externa applikationer Program (exe-filer) eller andra befintliga applikationer, exempelvis Excel som länkar till Inventor. 3. Interna AddIns Program som laddas när Inventor startas och körs inifrån Inventor. Dessa program skapas som dll-filer i något externt utvecklingsverktyg, exempelvis Visual Basic 6.0. AddIns kan inte skapas med VBA. 4. Externa AddIns Ett externt exe-program kan fungera som ett AddIn, men köras som fristående program. Denna metod används främst under utvecklingsarbete. 5. Apprentice Server Sådan är att liknas vid en version av Inventor utan användarinterface. Fristående applikationer kan skapas som läser/skriver data från Inventor filer utan att Inventor behöver vara installerat. 6(23)
2.3 Sammanställningsfiler i Inventor Strukturen för en sammanställningsfil i Inventor (Inventor Assembly, iam-filer) illustreras i Figur 2. En Inventorsammanställning består av en eller flera detaljer (Inventor Part, ipt-filer) eller delsammanställningar (iam-filer). En sammanställningsfil innehåller i sig inga detaljer, utan enbart sökvägar till de ingående detaljerna och delsammanställningarna, samt data om hur de sitter ihop. En detalj (Inventor Part, ipt-fil) är just en detalj, exempelvis ett golv som ritas upp i en eller flera skisser (Sketches) och förses med tredimensionella egenskaper (Features). I figuren nedan är en delsammanställning av våning 2 i byggnaden aktiv. I sökträdet till vänster i figuren är delarna för just denna sammanställning upplysta. Häftstiften i sökträdet visar att delarna är fast placerade (grounded) i sammanställningen och inte kan flyttas. Figur 2. Exempel på strukturen hos en Inventorsammanställning. Här med en delsammanställning, Floor2Components, aktiv. Man kan gå in i filstrukturen genom sökträdet och arbeta med enskilda detaljer. Om ändringar görs i en detalj så återspeglas det i originalfilen. I en sådan här sammanställning måste därför varje detalj och delsammanställning vara en egen fil. Det här gör även att det inte går att lägga in samma våning flera gånger för att skapa byggnaden. Om man gör det och sedan lägger till en dörr i väggen på en våning, kommer alla våningar få en dörr. Genom att högerklicka på en fil i sökträdet kan man också komma åt dokumentens egenskaper (Properties). I dokumentegenskaperna finns en flik, Custom, som är till för egendefinierade egenskaper. 7(23)
3 Kravspecifikationer Kravspecifikationen från företaget preciserades och förändrades under arbetets gång. Målet var att skapa en användarvänlig grundapplikation för att rita upp golv och ytterväggar till en byggnad i Inventor. Den första detaljerade specifikationen beskrev en applikation för rektangulära byggnader där alla mått anges i ett formulär. Applikationen beskrevs i tre delar, Den första delen tog upp användar gränssnittet, den andra filstrukturen och den sista lagringen av värdena. Senare ändrades kraven så att tyngdpunkten lades på att applikationen skulle utgå från en skiss i Inventor för att få möjlighet att rita byggnader med godtycklig form. 3.1 Grundapplikation där alla värden anges i ett formulär 3.1.1 Användargränssnittet. Del 1 beskriver ett användargränssnitt där användaren ska mata in ett antal värden i ett formulär. Dessa värden är längd, bredd, antal våningar, våningshöjd (golvtjocklek + vägghöjd), golvtjocklek samt tjocklek på ytterväggar. Eftersom hela byggnaden baseras på dessa värden kommer endast fyrkantiga byggnader att kunna ritas med hjälp av den här applikationen. 3.1.2 Filstrukturen Del 2 beskriver en funktion som ska skapa en filstruktur av sammanställningsfiler i Inventor. Filstrukturen ska skapas utifrån antalet våningar som matats in. Huvudsammanställningsfilen ska innehålla delsammanställningar för varje våning. I dessa delsammanställningar ska det finnas ytterligare en nivå med delsammanställningar vilka ska innehålla detaljerna för golv och väggar. I exemplet i Figur 3 nedan är Building.iam huvudsammanställningsfil, Floor1:1 är delsammanställning för en våning och Floor1Components:1 delsammanställningen som innehåller detaljerna. Figur 3. Filstruktur i den första kravspecifikationen. 8(23)
3.1.3 Lagring av värden Del 3 är en funktion som ska lagra alla värden som användaren matat in i huvudsammanställningsfilens flik för egendefinierade egenskaper, Custom Properties. 3.2 Applikation där byggnaden skapas från en skiss Grundapplikationen skulle utvecklas så att programmet utgår från en godtycklig skiss, exempelvis som i Figur 4. Användaren börjar med att rita och måttsätta en kontur i en skiss i Inventor. Tjockleken på golvet och höjden för väggen ska sedan skrivas in i ett formulär. När värdena skrivs in i formuläret, ska referenslinjer i skissen visa höjden på golvet eller väggen på samma sätt som när man bygger upp en höjd direkt i Inventor. Kraven på filstruktur och lagring av egenskaper var desamma som i föregående specifikation. Figur 4. Exempel på en skiss i Inventor som en byggnad baseras på. 9(23)
4 Genomförande Målet med arbetet var att skapa ett internt AddIn till Inventor. Under utvecklingen av programmen har vi arbetat med exe-program, eftersom det är enklare att testa och felsöka. Ett exe-program kan köras direkt från Visual Basic medan man måste starta om Inventor efter varje ändring för att testa ett AddIn. 4.1 Grundapplikation där alla värden anges i ett formulär 4.1.1 Användargränssnittet Den första grundapplikationen gjorde vi endast i form av ett exe-program. När programmet körs startas först Inventor om det inte redan är igång. Sedan öppnas formuläret som visas i Figur 5. Användaren ska i formuläret ange byggnadens längd, bredd, våningshöjd, golvtjocklek och väggtjocklek i millimeter, samt hur många våningar byggnaden ska bestå av. Genom att trycka på OK-knappen ska byggnaden ritas upp och sammanställas i enlighet med den specificerade filstrukturen. Om det inte är siffror inskrivna eller om något inmatningsfält inte är ifyllt, visas ett felmeddelande och programmet går inte vidare förrän användaren fyllt i alla fält korrekt. Figur 5. Användargränssnitt för grundapplikation där alla värden anges i ett formulär. 4.1.2 Filstruktur och lagring När formuläret är riktigt ifyllt, går programmet vidare. Först ritas golvet upp i en skiss i ett nytt PartDocument, vilket ska sparas som en detalj (ipt-fil). Användaren kan välja att spara med det defaultvärde på filnamn och sökväg till katalogen i aktuellt Inventorprojekt som finns förinskrivet i Spara-dialogen, men har också möjlighet att välja annat. När golvet är sparat, stängs det dokumentet och ett nytt tomt PartDocument skapas. Väggarna ritas upp i det nya dokumentet och sparas på samma sätt som golvet. Applikationen skapar därefter ett sammanställningsdokument och sätter ihop golvet och väggen till en våning som sparas i en delsammanställning (iamfil). Figur 6 visar ett exempel på golv, vägg och delsammanställningen av en våning. 10(23)
floor1.ipt wall1.ipt Floor1Components.iam Figur 6. Detaljer och delsammanställning i grundapplikationen. Ytterligare en delsammanställning skapas och läggs i huvudsammanställningsfilen Building.iam. Värden som användaren skrivit in i formuläret sparas i huvudsammanställningsfilens Custom Properties. Den färdiga huvudsammanställningsfilen och fliken för egendefinierade egenskaper ses i Figur 7 nedan. Figur 7. Färdig byggnad skapad från inmatade värden. 11(23)
4.2 Applikation där byggnaden skapas från en skiss Applikationen körs som en AddIn i Inventor, dvs. laddas automatiskt när Inventor startas. För att kunna använda applikationen måste en sketch vara aktiv. Användaren börjar med att rita upp konturen för byggnaden och måttsätta den. Därefter startas applikationen med en knapp på sketchens verktygsmeny. I Figur 8 nedan visas hur användaren ritat och måttsatt ytterkonturen för byggnaden. Figur 8. Byggnadens kontur uppritad och måttsatt i en skiss. Knappen NewBuilding är markerad i verktygsmenyn. 12(23)
När programmet startas, visas en dialogruta där användaren skriver in tjockleken på golvet och hur många våningar byggnaden ska bestå av. När användaren skriver i inmatningsfältet för golvtjockleken, ritas referenslinjer som visar höjden. I Figur 9 nedan illustreras hur angivet värde på golvets tjocklek visas med hjälp av referenslinjer. Här syns också formuläret för golvtjocklek och antal våningar. Figur 9. Golvtjocklek representerad med referenslinjer. 13(23)
När användaren tryckt på OK-knappen, raderas referenslinjerna och byggnadens golv skapas. En kopia för varje våning sparas som en detalj på samma sätt som i den första grundapplikationen. Därefter blir skissen aktiv igen och en ny dialogruta för vägghöjden visas. Här måste användaren först själv rita in väggens innerkontur i skissen. Därefter kan användaren skriva i fältet för vägghöjden och se höjden som referenslinjer. I Figur 10 nedan syns formuläret för vägghöjden, samt hur angivet värde på vägghöjden visas med hjälp av referenslinjer. Figur 10. Angiven vägghöjd visas med hjälp av referenslinjer. 14(23)
När användaren är nöjd med vägghöjden, trycks OK-knappen och byggnadens väggar skapas och sparas på samma sätt som golven. Därefter sätter applikationen automatiskt ihop våningen, skapar sammanställningar för byggnaden och sparar filer enligt den givna strukturen. Värden som användaren angivit i dialogrutorna sparas i huvudsammanställningsfilens egendefinierade egenskaper (Custom Properties). I Figur 11 nedan visas hela byggnaden efter att golv och väggar satts ihop i delsammanställningar som samlats i huvudsammanställningsfilen. Man kan även se hur de angivna värdena har lagts till i filens Custom Properties. Figur 11. Sammanställning av hela byggnaden och värdena i Custom Properties. 15(23)
5 Programmens uppbyggnad 5.1 Grundapplikation där alla värden skrivs in av användaren Den första grundapplikationen är endast gjord som fristående exe-fil och består av ett formulär, frmgrundapp, samt fyra fristående moduler, modfiledialog, modinventorref, modbuildingpart och modbuildingassembly. Byggnaden skapas genom anrop av funktionerna i modulerna när OK-knappen i formuläret trycks. Applikationen skapar vid start en referens till Inventor. Formuläret visas med tomma inmatningsfält för byggnadens längd, bredd, våningshöjd, antal våningar, tjockleken på golvet och höjden för väggen samt knappar för hjälp, OK och Cancel. Hela programmet körs då man klickar på OK-knappen genom anrop av funktionerna på det sätt som beskrivs nedan. Programmet börjar med ett anrop av funktionen testinput( ), som kontrollerar att inmatningsfälten inte är tomma och att det är numeriska värden i dem. Därefter anropas getbuildingassembly( ), som returnerar ett nytt sammanställningsdokument. De värden som användaren angett läggs in i Custom Properies med hjälp av funktionen setuserdefinedproperties( ). Sedan går programmet in i en loop där ett nytt PartDocument skapas och golvet ritas upp genom anrop av createfloorpart( ). Golvet sparas med funktionen savewithfiledialog( ). Programmet fortsätter och anropar createbuildingwalls( ) som skapar ett nytt PartDocument och fyra skisser i xy-planet samt anropar funktionen drawonewall( ) för uppritning av väggarna. Efter detta görs ett nytt anrop av funktionen savewithfiledialog( ) som sparar väggarna. I createassembly( ) skapas en matris och ett sammanställningsdokument för att lägga in och placera golv- och väggfilerna i sammanställningen. Ytterligare ett anrop av funktionen savewithfiledialog( ) görs för att spara sammanställningsdokumentet som skapades i createassembly( ). Ett anrop av createtopassembly( ) skapar nytt sammanställningsdokument där våningsplanen placeras i delsammanställningen. Anrop av savewithfiledialog( ) sparar detta sammanställningsdokument. Därefter anropas funktionen addfloortobuilding( ) som skapar en xyz-matris för placering av våningarna. Här görs en beräkning av höjden i z-planet innan våningen placeras i huvudsammanställningsfilen. Antal varv i loopen bestäms av hur många våningar som angetts i formuläret. För att få den färdiga byggnaden centrerad i det aktiva fönstret anropas zoomactiveewindow( ). Ett sista anrop av funktionen savewithfiledialog( ) sparar huvudsammanställningsfilen i det sammanställningsdokument som skapades i funktionen getbuildingassembly( ). Därefter avslutas programmet. 16(23)
5.1.1 Moduler och funktioner Funktionen testinput( ) tar en array av namn och värden som argument. Den returnerar sant eller falskt. Funktionen loopar igenom inmatningsfälten och kontrollerar att det finns numeriska värden i alla fält. Om det saknas värde i något inmatningsfält, sätts testinput till falskt, ett meddelande visas att fältet måste fyllas i för att gå vidare och markören sätts i aktuellt fält. När alla fält är korrekt ifyllda, fylls arrayen med namn och värden. modinventorref: Modulen innehåller funktioner för att skapa referenser till Inventor. Funktionen getinventorref( ) tar referensen till Inventor som argument. Den returnerar sant eller falskt. Funktionen kontrollerar om Inventor är startat och sätter referens till Inventor. Den returnerar sant om allt gått bra. Funktionen getbuildingassembly( ) tar referensen till Inventor som argument. Den returnerar ett nytt asssemblydocument. modfiledialog: Modulen innehåller en funktion för att spara filer. Funktionen savewithfiledialog( ) tar referensen till Inventor och ett filnamn som argument. Funktionen sätter referens till aktivt dokument i Inventor och skapar ett fildialogobjekt. Den sätter aktuell katalog och argumentets filnamn som default i dialogen. Sätter ipt (part) och iam (assembly) som default filtyp. Om Cancel-knappen trycks returnerar funktionen falskt och avslutas, annars om OK-knappen trycks sparas aktiva dokumentet till en fil och stängs sedan. modbuildingpart: Modulen innehåller funktioner för att skapa golv och väggar. Funktionen createfloorpart( ) tar referensen till Inventor och värden på längd, bredd och golvtjocklek som argument. Den returnerar sant eller falskt. Funktionen skapar ett nytt PartsDokument i Inventor, ritar en rektangel i en skiss i xy-planet och bygger upp golvtjockleken i z-planet. Funktionen createbuildingwalls( ) tar referensen till Inventor och värden på längd, bredd, väggtjocklek och vägghöjd som argument. Den returnerar sant eller falskt. Funktionen skapar ett nytt PartsDokument i Inventor. Sex punkter skapas utifrån längd, bredd och väggtjocklek. Skapar fyra skisser i xy-planet och anropar funktionen drawonewall( ) för att rita upp väggarna. Funktionen drawonewall( ) tar referensen till Inventor, en skiss, två punkter, referensen till detaljdokumentets Component Definition och vägghöjd som argument. Den ritar en rektangel i en skiss i xy-planet och bygger upp vägghöjden i z-planet. Den returnerar sant eller falskt. 17(23)
modbuildingassembly: Modulen innehåller funktioner för att skapa sammanställningar. Funktionen createassembly( ) tar referensen till Inventor och två filnamn som argument. Den returnerar sant eller falskt. Funktionen skapar nytt sammanställningsdokument i Inventor. En matris för x-, y- och z-koordinater skapas för placering av delarna i sammanställningen. Funktionen lägger in golv- och väggfilerna i sammanställningsdokument och placerar objekten med hjälp av matrisen. Objekten görs Grounded, dvs. de kan inte flyttas. Detta blir sammanställning av ett våningsplan. Funktionen createtopassembly( ) tar referensen till Inventor och ett filnamn som argument. Den returnerar sant eller falskt. Funktionen skapar nytt sammanställningsdokument i Inventor för placering av ett våningsplan i en delsammanställning. Funktionen addfloortobuilding( ) tar referensen till Inventor, ett filnamn, våningsnummer, våningshöjden och ett sammanställningsdokument som argument. Den returnerar sant eller falskt. En matris för x-, y- och z-koordinater skapas för placering av delarna i sammanställningen. Funktionen beräknar höjden i z-planet för varje våningsplan med hjälp av våningsnumret och våningshöjden. Våningen placeras med hjälp av matrisen och görs grounded. Funktionen zoomactiveewindow( ) centrerar objektet i Inventors aktiva fönster. modproperties: Modulen innehåller funktioner för att skriva egenskaper i Inventors Document Properites. Funktionen setuserdefinedproperties( ) tar referensen till ett Inventordokument och en array av namn och värden som argument. Den returnerar sant eller falskt. Funktionen loopar igenom arrayen och sätter namn och värden i ett PropertySet objekt av typen User Defined Properties som har metoder för att skriva i Custom Properties. Funktionen existpropertyname( ) kontrollerar om det redan finns en egenskap med det namnet. I så fall ersätts endast värdet. 18(23)
5.2 Applikation där byggnaden skapas från en skiss För att skapa en AddIn till Inventor i VB gör man ett ActiveX DLL project. Projektet måste innehålla en klassmodul. Modulen innehåller funktioner för att sätta referenser till Inventor och knapp för programstart som placeras i sketchmenyn. Applikationen innehåller två formerna, frmfloor och frmwall. I övrigt är uppbyggnaden likadan som grundapplikationen. Funktionerna tar dock inte längre någon referens till Inventor som argument, utan applikationsobjektet är här globalt. Vid start kontrolleras om det finns ett aktivt PartDocument. Om det finns så laddas formen frmfloor annars visas ett felmeddelande. Formen frmfloor innehåller inmatningsfält för golvtjocklek och antal våningar, samt knappar för OK och Cancel. Vid ändring av text i inmatningsfältet för golvtjocklek anropas först funktionen checkactivedoc( ) som kontrollerar att ett PartDocument är öppet och en skiss är aktiv. Därefter kontrolleras att det inskrivna värdet är numeriskt. Vid första ändringen anropas setclientgraphics( ) som loopar igenom alla enheter i skissen och skapar en array för att rita upp grunden för referenslinjer i xy-planet. Därefter ändrar changehight( ) höjden på referenslinjerna. Vid upprepade ändringar anropas enbart den sist nämnda funktionen. Programmet fortsätter att köras när man klickar på OK-knappen genom anrop av funktionerna testinput( ) som kontrollerar att värdena är numeriska och textfälten inte är tomma, delclientgraphics( ) som raderar referenslinjerna och drawfloor( ) som ritar upp och sparar golven. Slutligen döljs formuläret och ett anrop görs som visar nästa formulär. Formen frmwall, innehåller inmatningsfält för vägghöjd samt knappar för OK och Cancel. Vid ändring av text i inmatningsfältet för vägghöjden anropas samma funktioner som vid ändring av golvtjockleken i formen frmfloor. Genom att klicka på OK-knappen i frmwall körs programmet färdigt genom att anrop av funktionerna som beskrivs nedan. Ett anrop av funktionen delclientgraphics( ) tar bort referenslinjerna. Sedan anropas drawwall( ) för uppbyggnad av väggarna som sparas. Ett nytt sammanställningsdokument skapas genom anrop av getbuildingassembly( ). De värden som användaren angett i formulären och dess namn läggs in i Custom Properties genom anrop av setuserdefinedproperties( ). I createassembly( ) skapas en matris och ett sammanställningsdokument för att placera golv- och väggfilerna i sammanställningen. Den sparas sedan med hjälp av funktionen savewithfiledialog( ). Sedan skapas ett nytt sammanställningsdokument genom anrop av createtopassembly( ) för att placera ett våningsplan i delsammanställningen. Ett anrop av savewithfiledialog( ) sparar detta sammanställningsdokument. Genom anrop av addfloortobuilding( ) placeras våningarna ovanpå varandra och blir till en byggnad. För att få byggnaden centrerad i det aktiva Inventorfönstret anropas zoomactiveewindow( ). Avslutningsvis anropas funktionen savewithfiledialog( ) som sparar huvudsammanställningsfilen i det sammanställningsdokument som skapades i funktionen getbuildingassembly( ). Därefter avslutas programmet. 19(23)
5.2.1 Moduler och funktioner modfiledialog (v.2): Modulen innehåller funktioner för att spara till filer. Funktionen savewithfiledialog( ) tar ett filnamn och en flagga som argument. Returnerar sant eller falskt. Detta är en utveckling av grundapplikationens savewithfiledialog( ). Nytt är flaggan som avgör om filen ska stängas eller behållas öppen. Funktionen savecopy( ) tar ett filnamn och en flagga som argument. Den returnerar sant eller falskt. Denna funktion sparar en kopia av det aktiva dokumentet till en fil, fungerar i övrigt på samma sätt som savewithfiledialog( ). moddraw2: Modulen innehåller några nya funktionerna för att skapa delar och sammanställningar som bygger på grundapplikationen. Funktionen checkactivedoc( ) tar inga argument. Den returnerar sant eller falskt. Funktionen kontrollerar att ett detaljdokument och en skiss är aktivt. Funktionen drawfloor( ) tar golvtjocklek, filnamn och antal våningar som argument. Den returnerar sant eller falskt. Funktionen tar den aktiva skissen i dokumentet och bygger upp golvtjockleken utifrån det angivna värdet. Utifrån våningsantalet görs sedan en loop där filnamn sätts och golven/golvet sparas med funktionen savecopy( ). Funktionen drawwall( ) tar vägghöjd, filnamn och antal våningar som argument. Den returnerar sant eller falskt. Väggen byggs upp och sparas som i drawfloor( ). Funktionerna createassembly( ), createtopassembly( ), addfloortobuilding( ) och zoomactiveewindow( ) är samma som i grundapplikationen. modsketchgraphics: Modulen innehåller funktioner som ritar upp referenslinjer utifrån angiven golvtjocklek och vägghöjd. Funktionen setclientgraphics( ) returnerar sant eller falskt. Den loopar igenom alla enheter i den aktiva skissen. Enheter representeras av exempelvis linjer, cirklar, ellipser och cirkelsegment. För cirkelsegment skapas punkter med hjälp av ändpunkterna, radien och centerpunkten vilka läggs i en array. För räta linjer sparas ändpunkterna direkt i en array. Värdena i arrayerna anger punkter i xyz-led som används för att rita upp referenslinjerna för konturen i xy-planet. Funktionen changehight( ) tar höjdvärde som argument. Den skapar en matris för att flytta en kopia av referenslinjerna i z-led, efter angivet höjdvärde. Den skapar en array av båda konturernas hörnpunkter och ritar de vertikala referenslinjerna. Funktionen delclientgraphics( ) tar inga argument. Den tar bort referenslinjer. Modulerna modinventorref och modproperties är samma som i grundapplikationen. 20(23)
6 Resultat och diskussion Resultatet av arbetet består av två olika applikationer som ritar upp golv och ytterväggar i Inventor. Den första grundapplikationen, som körs i ett fristående exeprogram där byggnaden ritas utifrån angivna mått, kan sammanfattas som i Figur 12. Detta program är lättarbetat. Användaren behöver endast ange byggnadens mått samt antal våningar i ett formulär. Detta begränsar byggnadens form till raka väggar och fyra hörn. Den andra applikationen, som körs som en AddIn i Inventor, kan rita byggnader med godtycklig form. Här får användaren först rita upp byggnadens ytterkontur och måttsätta den i en skiss. Därefter anges golvtjocklek och antal våningar i ett formulär. Användaren måste sedan också själv rita in väggens innerkontur i skissen innan vägghöjden anges i ett nytt formulär. Först därefter ritas hela byggnaden upp i Inventor. Den måttsatta ytterkonturen med referenslinjer för golvhöjden, väggen med referenslinjer och slutresultatet visas i Figur 13. Figur 12. Grundapplikationen med alla värden inmatade. Figur 13. Byggnad från en godtycklig skiss. Den första grundapplikationen anses färdig, förutom databasen. Den uppgiften lades ner i samråd med handledaren på företaget, eftersom kravspecifikationen förändrades. En förbättring av programmet som skulle göra det snabbare och effektivare vore att användaren endast avslutningsvis får välja om byggnaden och dess tillhörande filer ska sparas. 21(23)
I den andra applikationen måste användaren redigera skissen mitt i programmet, innan vägghöjden skrivs in i formuläret, för att få tjockleken på väggarna. Programmet klarar inte av att skissen ändras efter att vägghöjden har skrivits in. Om skissen innehåller cirkelbågar, blir det en förskjutning mellan golv och väggar i sammanställningen då offseten måttsätts i Inventor. Funktionen för referenslinjerna ritar endast räta linjer och cirkelbågar. Den behöver utökas med alla enheter som kan ritas i Inventors skisser. Problemet med förskjutningen skulle kunna åtgärdas på olika sätt. En åtgärd är en funktion som skapar offseten, dvs. tjockleken på ytterväggarna, direkt från en kontur. Användaren skulle då ange väggtjocklek i formuläret. En annan är att användaren ritar upp två konturer från början och måttsätter och sedan gör programmet resten. Då slipper man också redigera skissen under programmets gång. En ytterligare förbättring skulle vara att peka på en kontur i ritningen för att välja vilken form man vill rita upp sin byggnad efter. Programmet nu förutsätter att det bara finns en kontur i skissen. 22(23)
7 Referenser [1] Perry, Greg och Hettihewa, Sanjaya: Sams Teach yourself Visual Basic 6 in 24 hours, Sams, 1998, ISBN 0-672-31533-5. [2] Mauer, Lowell: Sams Teach yourself more Visual Basic 6 in 21 days, Sams, 1998, ISBN 0-672-31307-3. [3] Autodesk Inventor API Programming Help [4] Ekins, Brian: Inside the Autodesk Inventor API, Autodesk University 2003. [5] Ekins, Brian och Kassulker, Kerwin: 101 ways to customise Inventor, Autodesk University 2003. [6] Autodesk Developer Center: http://www.autodesk.com/developinventor 23(23)