Het tekenen van antenne frames en genereren van een tekeningenlijst
Auteurs:
Jan-Antoon van Burk Pedro Sans Prieto
Afstudeeropdracht in het kader van de opleiding HBO AutoCAD engineer. Begeleidende docent: Ir. R. Boeklagen
Tekenen van telecom sites Het tekenen van antenne frames en genereren van een tekeningenlijst
Auteurs:
Jan-Antoon van Burk Pedro Sans Prieto
Afstudeeropdracht in het kader van de opleiding HBO AutoCAD engineer. Begeleidende docent: Ir. R. Boeklagen Arnhem
6 juni 2003
Voorwoord Dit verslag is geschreven ten behoeve van de afstudeer opdracht in het kader van de opleiding HBO AutoCAD engineer. Tevens dient het als naslagwerk en als handleiding voor de omschreven applicaties.
Voor deze cursus is gekozen om teneinde onze kennis omtrent Autocad te vergroten. Vooral het leren van programmeren leek ons zeer interessant. Ons uitgangspunt was door een programma te schrijven een belangrijk deel van het tekenpakket in zeer korte tijd te voltooien.
Omdat wij beiden op dezelfde afdeling werken en samen een applicatie schrijven om het tekenpakket te automatiseren leek het ons logisch samen het afstudeer project te maken.
2
Inhoudsopgave Voorwoord ........................................................................................................................2 Inleiding ............................................................................................................................5 1
Achtergrond van het onderwerp................................................................................6 1.1 Werkgever .............................................................................................................6 1.2 Wat is een telecom site..........................................................................................8 1.3 Ervaringen met AutoCAD...................................................................................10 1.3.1
Jan-Antoon van Burk ..................................................................................10
1.3.2
Pedro Sans Prieto ........................................................................................10
1.4 Onderwerpkeuze .................................................................................................11 2
Huidige situatie .......................................................................................................12 2.1 Het antenneframe ................................................................................................12 2.2 Tekeningenlijst....................................................................................................12
3
Mogelijke oplossingen ............................................................................................13 3.1 Antenne frame.....................................................................................................13 3.1.1
Blokken bibliotheek met frames .................................................................13
3.1.2
Blokken bibliotheek met profielen..............................................................13
3.1.3
Standaard frame met valse maten ...............................................................13
3.1.4
Een applicatie ..............................................................................................14
3.2 Tekeningenlijst....................................................................................................14 3.2.1
Blokken met attributen................................................................................14
3.2.2
Applicatie ....................................................................................................14
3.3 Applicatie in VBA of Lisp ..................................................................................14 3.4 Conclusie.............................................................................................................15 4
Ontwerp van de applicaties .....................................................................................16 4.1 Antenne frame.....................................................................................................16 4.2 Tekeningenlijst....................................................................................................21
5
4.2.1
Controle.......................................................................................................22
4.2.2
Invullen tekeninghoofden............................................................................26
4.2.3
Tekeningenlijst genereren ...........................................................................32
Handleiding voor de applicaties..............................................................................37 5.1 Antenne frame.....................................................................................................37 3
5.2 Tekeningenlijst....................................................................................................41 6
Conclusie.................................................................................................................44
Literatuurlijst...................................................................................................................45
Bijlage 1: Voorbeeld tekeningenlijs Bijlage 2: Voorbeeld tekeningen T-frame
4
Inleiding Voor deze afstudeeropdracht hebben wij geprobeerd de tijd voor het maken van een tekeningenset in tekorten. Nadat we de verschillende tekensets hebben bekeken zijn wij tot de conclusie gekomen dat het tekenen van de diverse frames veel tijd kost en er vaak fouten worden gemaakt. Ook was er een verschil te zien tussen de tekeningen van de verschillende tekenaars. Door het tekenen van deze frames te automatiseren wordt de benodigde tijd voor deze tekening aanzienlijk ingekort. Daarbij wordt het makkelijker om de tekeningen te controleren doordat de tekeningen dezelfde opbouw hebben.
Tevens zijn wij tot de conclusie gekomen dat het invullen van de tekeninghoofden en het maken van de tekeningenlijst tijdrovend en fouten gevoelig is doordat het overtypen van informatie is. Door met behulp van een toepassing de tekeningenlijst te genereren wordt de tijd verkort en minder fouten gemaakt ook wordt het controleren van alle titels en tekenhoofden overbodig.
In het eerste hoofdstuk wordt een korte beschrijving gegeven van onze achtergrond en de werkzaamheden die wij op dit moment verrichten. Hier komt ook naar voren waarom wij deze routines zijn gaan maken. In het tweede hoofdstuk staat een beschrijving van de tekenwijze zoals die op dit moment gehanteerd wordt en de daardoor ontstane problemen en de oorzaken daarvan. In het daarop volgende hoofdstuk worden verschillende oplossingen voor beide probleemstellingen apart behandeld. In het vierde hoofdstuk wordt de opbouw van de applicaties beschreven. In hoofdstuk vijf wordt de werking van de toepassingen omschreven.
5
1 Achtergrond van het onderwerp
1.1 Werkgever Wij zijn werkzaam bij Cumae op de afdeling bouwkunde bij de telecom groep. Cumae is een projectmanagement en ingenieursbureau dat in 1998 is ontstaan uit de samenvoeging van vier verschillende bureaus. Deze bureaus waren voorheen Hiddinga, Heijckmann, Nagtlas-Veenhuizen en Davu. De naam Cumae is een verwijzing naar het orakel van de stad Cumae in Zuid-Italië. In de oudheid namen vorsten en krijgsheren pas een belangrijke beslissing na het raadplegen van dit orakel. Van uit deze gedachtegang wil Cumae haar opdrachtgevers met raad en daad bijstaan in belangrijke beslissingen en ontwikkelingen in hun bedrijf. Cumae heeft momenteel een hoofdvestiging in Arnhem en een nevenvestiging in Capelle aan de IJssel.
Cumae streeft ernaar om de projecten integraal aan te pakken, vanaf probleem tot aan nazorg. En dat zoveel mogelijk multidisciplinair. Hierdoor staat Cumae voor het concept Total Consulting, de integratie van management, advies en ontwerp. Cumae treedt op als regisseur namens de opdrachtgever en integreert en organiseert alle werkzaamheden in een project. Contractueel gezien gaat de opdrachtgever één contract aan met Cumae voor management-, ontwerp- en adviesdiensten. Na aanbesteding gaat de opdrachtgever rechtstreeks een contract aan met de uitvoerende partijen waarbij Cumae zorgdraagt voor een uitvoering volgens plan. Met dit pakket van diensten wil Cumae zich onderscheiden van andere ingenieursbureaus.
De werkwijze van Cumae is gericht op werken vanuit een specifieke situatie van de opdrachtgever. Er wordt gewerkt met een team professionals onder leiding van een projectleider of projectmanager. Dit team wordt samengesteld uit een combinatie van kennisgebieden, zodat er effectieve oplossingen ontstaan voor het vraagstuk van de opdrachtgever. Hierbij worden theoretische en praktische kennis op het gebied van projectmanagement en de vakdisciplines gecombineerd met die van de opdrachtgever. 6
Cumae biedt diensten aan, maar bouwt zelf niets. Met ongeveer 160 medewerkers in de verschillende afdelingen (voor organogram zie figuur 1) realiseert men managementadvies en –ontwerp voor de verschillende opdrachtgevers. Directiesecretariaat
Directieteam Cumae Management team
Kwaliteitszorg
Projectmanagement
Financien & control
Marketing & sales
Facilities & logistiek
Financiën & administratie
Machinebouw
Gebouwinstallaties
Bouwkunde
Automatisering
Industrial control
Personeel & organisatie
Constructietechniek
Procestechniek
Afdelingsmanager Management assistente
Telecom groep
Bouw
Site engineer
Constructeur
Tekenaar
Figuur 1: Organogram Cumae
De werkzaamheden van de telecom groep is het inmeten, berekenen en uittekenen van antennelocaties (sites) voor de mobiele telefonie. Het project is ondergebracht bij de afdeling bouwkunde, maar het werk is behalve bouwkundig ook werktuigbouwkundig, elektrotechnisch en constructief. Omdat voor de uitvoering enige kennis over telecom sites noodzakelijk is is er voor gekozen om een vaste groep op dit project te plaatsen. Doordat er verschillende werkgebieden bij dit project zijn betrokken is dit een goed voorbeeld van een multidisciplinair project.
7
1.2 Wat is een telecom site Een telecom site bestaat uit kasten met daarin de benodigde apparatuur en een aantal masten (poles) waaraan de antennes worden gehang. Per site worden er drie paneel antennes, dit zijn rechthoekige antennes die signaal van de mobiele telefoon ontvangen en naar de mobiele telefoon sturen, en meestal twee ronde schotelantennes (dishes), die de verbinding tussen de verschillende sites verzorgen, geplaatst (zie figuur 2).
Figuur 2: Telecom site
Het signaal van een paneel antenne is te vergelijken met een zaklamp en heeft een horizontale openingshoek van 120 graden, dat wil zeggen dat de antenne horizontaal een spreiding heeft van 120 graden en dus drie antennes 360 graden en dus het gehele gebied rondom de site bereiken. De verticale openingshoek is 15 graden. Hierdoor kun je een antenne niet te dicht op de dakrand plaatsen, omdat de antenne dan op het dak straalt. Het bereik van de antennes is afhankelijk van de obstakels, zoals bomen en gebouwen die in de omgeving van de site staan.
Het signaal van de dishes is te vergelijken met een laser dus een rechte lijn, waarbij de ene dish op een andere dish van een andere site straalt. Beide dishes zenden en ontvangen het signaal. 8
Als een antenne tegen een obstakel of op het dakvlak straalt wordt dit shadowing genoemd. Dit moet zoveel mogelijk worden vermeden om zend verlies te voorkomen. Ook is de capaciteit van een antenne beperkt waardoor je in grote steden veel sites, vooral in het centrum bij elkaar ziet. Doordat een antenne mast niet hoger mag zijn als 5 meter, zonder een bouwvergunning te hoeven aanvragen, moet er vaak meerdere masten op een dak worden geplaatst. Dit om shadowing te voorkomen.
In het kort gaat het signaal dus zo: • U belt met uw mobiele telefoon • Uw mobiele telefoon stuurt een signaal naar de paneelantenne van de dichtstbijzijnde site • Het signaal wordt door de antenne opgevangen en naar de apparatuurkasten gestuurd door een kabel (feeder) • De apparatuurkasten sturen het signaal naar een dish • De dish stuurt het signaal naar een andere dish op een andere site • Deze tweede dish stuurt het signaal naar de apparatuurkasten • De apparatuurkasten sturen het signaal naar een paneel antenne • De antenne stuurt het signaal naar de mobiele telefoon van degene naar wie u belt • De mobiele telefoon ontvangt het signaal en gaat over. • Nadat de telefoon wordt opgenomen wordt er weer een signaal via dezelfde weg terug gestuurd
Nadat een provider een locatie heeft uitgezocht en de eigenaar heeft toestemming geven voor het plaatsen van antennes, wordt eerst door de provider zelf bekeken of de locatie bruikbaar is voor het plaatsen van een site. Als een locatie bruikbaar is worden wij uitgenodigd om de locatie te bekijken en wordt terplekke bepaalt waar de antennes en apparatuur moet worden geplaatst. Omdat het bepalen van de antenne richtingen en locaties een specialistische aangelegenheid is wordt dit door radio technische mensen van de betreffende provider gedaan. Na dit bezoek wordt dit op het kantoor uitgewerkt in een rapport en een tekeningen pakket, aangevuld met de benodigde berekeningen voor de bestaande en nieuwe constructie. 9
Pedro houdt zich voornamelijk bezig met het tekenen van de site en het uittekenen van de toegepaste constructies. Jan-Antoon houdt zich daarnaast ook bezig met het opmeten van de sites en het maken van de rapporten.
1.3 Ervaringen met AutoCAD
1.3.1 Jan-Antoon van Burk Tijdens mijn studie aan de HTS en de MTS heb ik kennis gemaakt met AutoCAD (versie 12), maar doordat alleen de basis vaardigheden aan bod kwamen (de leraar kende het programma niet beter) vond ik het toen niet echt interessant. Toen ik tijdens de stageperiode echt met AutoCAD ging werken en er bij het stagebedrijf ook wat dieper op AutoCAD werd ingegaan ben ik mij meer gaan interesseren voor het programma. Na mijn studie heb ik bij verschillende werkgevers met AutoCAD gewerkt, waardoor ik met verschillende onderdelen heb gewerkt, zoals viewports, Xrefs, scripts en dergelijke. Toen ik bij Cumae kwam werken werd er met AutoCAD 14 en met standaard tekeningen en blokken gewerkt. Ik ben toen in een rustige periode begonnen met een menu op te zetten in Lisp, wat ik mezelf heb aangeleerd. Doordat steeds meer de vraag kwam naar andere functies en ik meer kennis van het programmeren wilde vergaren ben ik deze opleiding gaan volgen.
1.3.2 Pedro Sans Prieto De eerste keer dat ik met AutoCAD tekende was in de tweede klas van de MTS, dat was toen nog versie 10/11. De mogelijkheden waren vrij beperkt en werken met het programma was redelijk omslachtig. Tekenen werd voornamelijk op de tekentafel gedaan.
Toen ik besloot tekenaar te worden deed ik een basiscursus AutoCAD 2000. Toen ik ging werken bij Cumae bleek dat er gewerkt werd met AcadCAD 14. Tijdens de werkzaamheden voor onze opdrachtgevers, telecom providers, bleek al gauw dat er veel tijdwinst te behalen viel door de werkwijze zoveel mogelijk te automatiseren. 10
Na enig overleg met het management werd er voor deze cursus gekozen waarin zowel programmeren in Lisp als in VBA aan de orde zou komen.
1.4 Onderwerpkeuze Omdat er steeds lagere bedragen per site worden betaald en wij hierdoor minder tijd per site kunnen besteden hebben wij geïnventariseerd waar tijdwinst te behalen is. Hierbij zijn wij tot de conclusie gekomen dat er vaak dezelfde frames, met verschillende afmetingen, worden toegepast voor de bevestiging van de antennes en de bijbehorende apparatuur, waaraan veel tijd wordt gespendeerd. Ook is er naar het totale pakket wat wij leveren aan de opdrachtgever gekeken en is er besloten om het geheel meer te standaardiseren en te vergemakkelijken en daardoor te versnellen.
Er van uitgaande dat het gebruik van de nieuwe applicatie voor het tekenen van een antenne frame de tijd voor het tekenen terugbrengt van ca. 8 uur naar ca. 10 minuten en voor het invullen van de tekeningenlijst ca. 5 minuten gaat duren in plaats van 30 minuten. En de site engineer nu minder tijd nodig heeft voor het controleren van het antenneframe en de tekenhoofden / tekeningenlijst wordt de totale tijdwinst voor een tekenaar gemiddeld 8 uur per site, voor een site engineer wordt dit ca. 2 uur.
Beide applicaties worden in een menu geplaatst waardoor het voor de tekenaar makkelijk te gebruiken is. Na het starten van de applicatie wordt de tekenaar een aantal gegevens gevraagd waarna het frame getekend wordt of de tekeningenlijst wordt gegenereerd.
11
2 Huidige situatie
2.1 Het antenneframe In de huidige situatie moet de tekenaar ieder frame opnieuw tekenen, maar doordat er een tijdslimiet is van 5 dagen waarbinnen het gehele pakket klaar moet zijn wordt er vaak vanuit een andere site onderdelen gekopieerd en aangepast. Doordat er door de tijdsdruk en door minder nauwkeurig tekenwerk verkeerde maten in de tekeningen voorkomen worden pos-lijsten vaak verkeerd ingevuld of gedeeltelijk aangepast na het kopiëren. Bij het controleren van de tekeningen worden deze fouten niet altijd ontdekt en wordt het staalwerk verkeerd aangeleverd. Gevolg problemen op de site tijdens het bouwen en mogelijke schade claims. Worden deze fouten wel ontdekt wordt vaak alleen de maatvoering aangepast waardoor bij een volgende site met hetzelfde frame dezelfde fouten in de tekening komen als het frame uit deze tekening wordt gekopieerd. Het gevolg is dat er regelmatig een onjuiste tekening als basis wordt gebruikt zodat er steeds dezelfde fouten voorkomen.
2.2 Tekeningenlijst Nu wordt de revisie datum in een standaard tekeningenlijst geplaatst die gedeeltelijk ingevuld op het voorblad van de template staat. In deze lijst staan de standaard benamingen van de veelvoorkomende tekeningen en worden de niet aanwezige tekeningen verwijderd. Veranderde tekeningnamen vergeet men aan te passen en tekeningen die zijn tussen gevoegd worden vergeten in de lijst te plaatsen. De verschillende tekeninghoofden worden een voor een ingevuld. Hierdoor wordt de schaal wel eens niet of verkeerd ingevuld.
12
3 Mogelijke oplossingen
3.1 Antenne frame
3.1.1 Blokken bibliotheek met frames Voor het tekenen van een antenne frame kun je gebruik maken van een standaard blokken bibliotheek, maar doordat niet ieder frame hetzelfde is moet je veel sterk op elkaar lijkende blokken maken. Hierdoor krijg je veel bloknamen die veel op elkaar lijken waardoor het kiezen van het juiste blok moeilijk wordt. Bovendien moet je deze blokken dan toch vaak in je tekening aanpassen aan de dragende constructie van het gebouw omdat je niet voor iedere situatie een blok kunt maken. Met deze oplossing blijft de werkwijze bijna hetzelfde als nu.
3.1.2 Blokken bibliotheek met profielen Door van de te gebruiken profielen blokken te maken met een standaard lengte en deze met een verschaling en / of rotatiehoek te plaatsen ben je flexibeler in de maatvoering van het frame. Als je daarnaast de maatvaste onderdelen en de details ook als blok in een bibliotheek plaatst kun je ieder frame tekenen. Hierbij moet de lengte en de eventuele hoekverdraaiing berekend worden. Dit is een tijdrovende en fouten gevoelige oplossing.
3.1.3 Standaard frame met valse maten Door een standaard frame te tekenen en deze iedere keer toe te passen waarbij de tekst van de maatvoering wordt gewijzigd heb je minder blokken nodig. Allen moet dan de lengtes van de verschillende profielen worden uitgerekend, wat weer fouten kan opleveren. Bovendien zijn fouten alleen te traceren als allen maten nagerekend worden.
13
3.1.4 Een applicatie Door een applicatie te schrijven die de lengte en de eventuele hoeken van de verschillende profielen berekend en deze hierna met de goede verschaling en hoekverdraaiing als blok in de tekening plaatst hoeft de tekenaar geen lengtes meer te berekenen. Hierdoor wordt de tijd korter en de kans op fouten kleiner.
3.2 Tekeningenlijst
3.2.1 Blokken met attributen Door op het voorblad een tekeningenlijst te plaatsen van blokken met attributen en hierin de standaard tekeningnamen vooraf in te vullen kun je de tekeningenlijst maken. De tekeninghoofden zijn ook een voor een handmatig in te vullen. Bij deze methode is de kans op fouten groot en is de benodigde tijd lang. Door met global attribut edit te werken gaat het sneller, maar bij type fouten moet de inhoud van een attribuut opnieuw ingetypte worden. De schaal moet dan alsnog op ieder blad worden ingevuld.
3.2.2 Applicatie Door de tekeningenlijst met behulp van een applicatie te genereren wordt de kans op fouten kleiner en de benodigde tijd korter. Door met behulp van deze applicatie ook de tekeninghoofden volledig in te vullen wordt vooral de kans op fouten verkleint.
3.3 Applicatie in VBA of Lisp Voor beide problemen is het schrijven van een applicatie een goede oplossing die veel tijd bespaard en fouten voorkomt. Deze applicaties kun je in VBA of in Lisp schrijven. Als we beide programmeer talen bekijken komen wij tot de volgende conclusie In VBA is het plaatsen van blokken minder omslachtig dan in lisp. Het grootste voordeel van VBA is dat de userform gebruiksvriendelijker te maken is doordat je gebruik kunt maken van plaatjes die zich aanpassen aan de invoer van de gebruiker. Voor het genereren van de tekeningenlijst moeten de attributen van de tekenhoofden worden 14
uitgelezen en in de blokken voor de tekeningenlijst worden geplaatst. Het uitlezen en het aanpassen van attributen is in VBA veel minder omslachtig dan in Lisp.
3.4 Conclusie De functie in Lisp die VBA niet kent zijn gemakkelijk met een functie in VBA zelf te schrijven. Het schrijven van de applicaties in VBA is minder omslachtig dan in Lisp. Daarom hebben wij gekozen voor VBA, maar de belangrijkste reden is de eenduidigheid van de userform door flexibeler gebruik van afbeeldingen op de userform.
15
4 Ontwerp van de applicaties
4.1 Antenne frame Het grootste gedeelte van deze applicatie bestaat uit het berekenen van insertion points, lengtes en hoeken van de verschillende te plaatsen blokken en het plaatsen van deze blokken. Om de gebruiker de benodigde maten in te laten voeren hebben wij gekozen voor een userform met daarop een afbeelding waar de ingevoerde maten verschijnen zodat duidelijk wordt welke maat is ingevoerd (zie figuur 3).
16
Start
T abbladnummer selecteren
Fout Invoer afmeting T -frame
Foutmelding
Insertionpoint T -frame
Ja Controle tabbladnum nieuw/bestaand
bestaand
Nieuw
bestaand tabblad verwijderen / nieuw tabbladnum
verwijderen
Bestaand tabblad verwijderen
nieuw tabbladnum
Nieuw tabblad hernoemen
Aanmaken nieuw tabblad
Blocken aanbrengen in tabblad
Aanmaken V-ports in tabblad
Atributs invullen
Einde
Figuur 3: Stroomschema T-frame 17
De foutmelding is er om er voor te zorgen dat er alleen getallen ingevoerd worden en dat de waarde die Foutmelding
ingevuld is voor het plaatsen van de klemplaten niet groter is dan de lengte van het profiel.
Verder wordt er na het wegklikken van de mesagebox ook weergegeven in welk tekstvak de fout is opgetreden door de achtergrond in de kleur rood te zetten. Public Sub controle2() Dim vallheal As Double On Error Resume Next vallheal = lengteheal.Value Dim valschrxricht As Double
On Error Resume Next valschrxricht = bevschoorxricht.Value
Dim vallhear As Double On Error Resume Next vallhear = lengtehear.Value
If OptionButton1.Value = True And valschrxricht > vallheal Then MsgBox "Ingevoerde waarde afstand klemplaat op profiel is te groot" bevschoorxricht.BackColor = &HFF& Else bevschoorxricht.BackColor = &H80000005 End If If OptionButton2.Value = True Then If valschrxricht > vallhear Then
MsgBox "Ingevoerde waarde afstand klemplaat op profiel is te groot" bevschoorxricht.BackColor = &HFF& Else bevschoorxricht.BackColor = &H80000005
18
End If End If End Sub
Nadat het inserpoint door de gebruiker is bepaald Controle tabbladnum nieuw/bestaand
wordt er nieuw tabblad aangemaakt, het niet mogelijk is om twee tabbladen de zelfde naam te geven.
Als het programma registreert dat het eerder gekozen tabbladnummer reeds bestaat verschijnt de volgende Mesagebox
Na het wegklikken van de vorige Mesagebox verschijnt er deze userform waarin de keuze gemaakt wordt om het bestaande tabblad te vervangen of het nieuwe tabblad te hernoemen.
19
In de onderstaande functie wordt een nieuw tabblad aangemaakt, indien er een fout optreedt wordt eerst een andere sub opgeroepen. Public Function newlayout(ByVal bladnr As String, ByVal omschr As String, ByVal schaal As String) As String Dim PlConfig As AcadPlotConfiguration Dim nlayout As AcadLayout Dim selset As AcadSelectionSet Dim el As AcadBlockReference Dim blockRefObj As AcadBlockReference Dim insertionpnt(0 To 2) As Double Dim attr As Variant Dim ZW_2000_A3 As Variant
insertionpnt(0) = 0: insertionpnt(1) = 0: insertionpnt(2) = 0 On Error Resume Next Set nlayout = ThisDrawing.Layouts.Add(bladnr) If Err Then ThisDrawing.SetVariable "ctab", bladnr Userform2.Show If Userform2.OptionButton3 = True Then newlayout = (Userform2.TextBox1.Value) Else newlayout = bladnr End If Set nlayout = ThisDrawing.Layouts.Add(newlayout) Else newlayout = bladnr End If Err.Clear ThisDrawing.SetVariable "ctab", newlayout Set PlConfig = ThisDrawing.PlotConfigurations.Item(ZW_2000_A3) ThisDrawing.ActiveLayout.CopyFrom PlConfig Set blockRefObj = ThisDrawing.PaperSpace.InsertBlock(insertionpnt, "Kader-cumae-dt", 1, 1, 1, 0) attr = blockRefObj.GetAttributes attr(0).TextString = omschr attr(3).TextString = newlayout attr(4).TextString = schaal blockRefObj.Layer = "0" blockRefObj.Update ZoomAll End Function
Om een beter idee te krijgen welke maat bij welk deel van het T-frame hoort is er een stuk code geschreven om de ingevoerde waarden bij de bijbehorende dimlijnen te zetten op het voorbeeld. Type Point x As Long y As Long End Type Type LOGFONT lfHeight As Long lfWidth As Long lfEscapement As Long lfOrientation As Long lfWeight As Long
20
lfItalic As Byte lfUnderline As Byte lfStrikeOut As Byte lfCharSet As Byte lfOutPrecision As Byte lfClipPrecision As Byte lfQuality As Byte lfPitchAndFamily As Byte lfFaceName(1 To 32) As Byte End Type Const Ps_Solid As Long = 0 Const Ps_Dash As Long = 1 Const Transparent = 1 Private Declare Function FindWindow Lib "user32" _ Alias "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function GetDC Lib "user32" (ByVal HWD As Long) As Long Private Declare Function LineTo Lib "gdi32" _ (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Declare Function ReleaseDC Lib "user32" _ (ByVal HWND As Long, ByVal hdc As Long) As Long Private Declare Function MoveToEx Lib "gdi32" _ (ByVal hdc As Long, ByVal x As Long, _ ByVal y As Long, punt As Point) As Long Private Declare Function CreatePen Lib "gdi32" _ (ByVal soort As Long, ByVal dikte As Long, _ ByVal kleur As Long) As Long Private Declare Function SelectObject Lib "gdi32" _ (ByVal hdc As Long, ByVal hpen As Long) As Long Private Declare Function DeleteObject Lib "gdi32" _ (ByVal hpen As Long) As Long Private Declare Function CreateFontIndirect Lib "gdi32" _ Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) _ As Long Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, _ ByVal nBkMode As Long) As Long Private Declare Function TextOut Lib "gdi32" _ Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, _ ByVal y As Long, ByVal lpString As String, _ ByVal nCount As Long) As Long
4.2 Tekeningenlijst Bij het ontwikkelen van deze applicatie is eerst naar de verschillende mogelijkheden gekeken voor het in de tekening opslaan van de site gegevens. Er waren verschillende mogelijkheden zoals xdata, een extern bestand en in een blok met attributen. Er is voor de laatste optie gekozen, omdat op het voorblad al een blok met attributen voor het sitenummer en adres stond en hieraan alleen twee onzichtbare attributen aan toe gevoegd hoefde te worden met de site engineer en de revisie. Als tekenaar werd in eerste instantie de inlognaam standaard ingevuld, maar doordat gebruik wordt gemaakt van 21
verschillende Windows versies en bij de ene versie wel de inlognaam de initialen van de tekenaar zijn en bij Windows 2000 dit Administrator is, wordt de inlognaam als start waarde opgegeven.
4.2.1 Controle Bij het starten van de applicatie worden eerst een aantal dingen gecontroleerd (zie figuur 4), zodat er geen foutmeldingen komen en het programma doorloopt. Ook ter voorkoming dat de gebruiker elke keer dezelfde gegevens moet invullen.
Start
Layout dezelfde naam geven als bladnummer
Controleren of het blok met site gegevens aanwezig is
Nee
Controleren of het voorblad aanwezig is
Ja
Ja
Blok met site gegevens inserten
Nee Voorblad invoegen
Nee
Controleren of het blok met site gegevens ingevuld is
Userform site gegevens invullen verschijnt
Waardes van het blok site gegevens worden op de userform gezet
Ja Site gegevens aanpassen
Ja
Invoer site gegevens door gebruiker
Nee Site gegevens invullen in blok site gegevens
Invullen tekeninghoofd
Figuur 4: Stroomschema controle
22
Om te controleren dat er geen twee dezelfde tekeningnummers voorkomen worden eerst de layouts dezelfde naam gegeven als het tekeningnummer. Als twee keer hetzelfde tekeningnummer voorkomt krijgt de gebruiker een melding om een layout te verwijderen of een ander tekeningnummer te geven en hierna de applicatie opnieuw te starten. 'Geeft de layouts de naam van het bladnummer op de layout. Function TekNum_LayNaam() Dim Selset_tekh As AcadSelectionSet Dim el As AcadBlockReference Dim attr As Variant Dim I As Integer Dim J As Integer Set Selset_tekh = Sel_Blok("Kader*") J=0 For Each el In Selset_tekh attr = el.GetAttributes For I = LBound(attr) To UBound(attr) If attr(I).TagString = "TEKNR" Then On Error Resume Next ThisDrawing.Layouts(J).Name = attr(I).TextString If Err Then MsgBox attr(I).TextString & " is twee keer in de tekening aanwezig." & vbCrLf & _ "Pas het tekening nummer en eventueel naam layout van een van" & vbCrLf & _ "beide tekeningen aan." & vbCrLf & _ "Als een van beide komt te vervallen Layout verwijderen" & vbCrLf & _ "Hierna applicatie opnieuw starten." End End If End If Next J=J+1 Next End Function
Controle site gegevens: door een selectie set met het blok "site_geg_vb" te maken en het aantal blokken te tellen wordt gekeken of het blok aanwezig is.
Controle voorblad: door een nieuwe layout aan te maken met de naam “0.0” wordt gecontroleerd of het voorblad aanwezig is. Als de layout al aanwezig is volgt er een foutmelding en wordt er geen layout aangemaakt zo niet wordt de layout aangemaakt.
Als de standaardwaarden in het blok met de site gegevens niet veranderd zijn wordt direct de userform voor het invullen van de site gegevens getoond. Als de standaard 23
waarden wel zijn aangepast wordt gevraagd of deze gegevens aangepast moeten worden. ' Controleert of het blok site_geg_vb aanwezig is zo niet wordt het blok geplaatst ' Controleert daarna of het blok is ingevuld zo niet invullen Public Sub inv_sitegeg() Dim punt(0 To 2) As Double Dim selset_sitegeg As AcadSelectionSet Dim sitenr_waarde As String Dim adres_waarde As String Dim plaats_waarde As String Dim el As AcadBlockReference Dim BlVB As AcadBlockReference Dim attr As Variant Dim GegAanp As Integer punt(0) = 250 punt(1) = 210 punt(2) = 0 Set selset_sitegeg = Sel_Blok("site_geg_vb") If selset_sitegeg.Count = 0 Then On Error Resume Next ThisDrawing.Layouts.Add ("0.0") ThisDrawing.SetVariable "ctab", "0.0" If Err Then Set BlVB = InsBlTab(punt, "voorblad", 1, 1, 0) BlVB.Explode Else InsBlTab punt, "site_geg_vb", 1, 1, 0 End If sitegeg.Show Else ThisDrawing.SetVariable "ctab", "0.0" For Each el In selset_sitegeg attr = el.GetAttributes sitenr_waarde = attr(0).TextString adres_waarde = attr(1).TextString plaats_waarde = attr(2).TextString siteeng_waarde = attr(3).TextString Next If sitenr_waarde = "SITE NUM." Or adres_waarde = "SITE ADRES" _ Or plaats_waarde = "PLAATS" Then sitegeg.Show Else GegAanp = MsgBox("Ingevulde waarden zijn:" & vbCrLf & _ "Site nummer : " & sitenr_waarde & vbCrLf & _ "Site adres : " & adres_waarde & vbCrLf & _ "Plaats : " & plaats_waarde & vbCrLf & _ "Site engineer : " & siteeng_waarde & vbCrLf & _ "Site gegevens aanpassen ?", vbYesNo) If GegAanp = vbYes Then sitegeg.Show End If End If End Sub
Omdat er vaak naar verschillende blokken moet worden gezocht hebben wij een functie geschreven die een selectie set maakt met daarin alle blokken met een in de oproep van de functie opgegeven naam. ' Maakt een selectieset met benoemde blok
24
Function Sel_Blok(BlNaam As String) As AcadSelectionSet Dim selsetnaam As String Dim b As Variant Dim filtt(0) As Integer Dim filtd(0) As String filtt(0) = 2 filtd(0) = BlNaam b = ThisDrawing.SelectionSets.Count selsetnaam = "ss" & b Set Sel_Blok = ThisDrawing.SelectionSets.Add(selsetnaam) Sel_Blok.Select acSelectionSetAll, , , filtt, filtd End Function
Om het invullen van de userform te vergemakkelijken en om bij wijzigen van de site gegevens niet alles opnieuw in te moeten vullen worden de waardes van het blok met de site gegevens op de userform. Omdat de bestandsnaam van de tekening het site-nummer is wordt het site-nummer als dit nog niet is ingevuld uit de bestandsnaam gehaald. Private Sub UserForm_Initialize() Dim sitenr_waarde As String Dim adres_waarde As String Dim plaats_waarde As String Dim siteeng_waarde As String Dim Tek_waarde As String Dim Teknaam As String Dim el As AcadBlockReference Dim attr As Variant Dim a As Integer Set selset_sitegeg = Sel_Blok("site_geg_vb") For Each el In selset_sitegeg attr = el.GetAttributes sitenr_waarde = attr(0).TextString adres_waarde = attr(1).TextString plaats_waarde = attr(2).TextString siteeng_waarde = attr(3).TextString Next Tek_waarde = UCase(ThisDrawing.GetVariable("LOGINNAME")) siteeng.AddItem "JBU" siteeng.AddItem "KJK" siteeng.AddItem "SYA" siteeng.AddItem "WKO" If adres.Text = "adres" Or plaats.Text = "plaats" Or Tek.Text <> "" Or Tek.Text <> "Administrator" Then klaar.Enabled = False ‘Omzetten van bestandsnaam naar site nummer als deze niet is ingevuld If sitenr_waarde = "SITE NUM." Then Teknaam = ThisDrawing.GetVariable("dwgname") a = Len(Teknaam) - 4 sitenr_waarde = Mid(Teknaam, 1, a) End If Sitenr.Value = sitenr_waarde adres.Value = adres_waarde plaats.Value = plaats_waarde siteeng.Value = siteeng_waarde Tek.Value = Tek_waarde End Sub
25
4.2.2 Invullen tekeninghoofden Om de tekeninghoofden in te vullen worden de attributen van het blok "site_geg_vb" uitgelezen en in het tekenhoofd geplaatst. Waarna de revisie wordt ingevuld (zie figuur 5).
Controle
Site gegevens uit blok site gegevens lezen
Site gegevens in tekeninghoofd plaatsen
Revisienummer uit blok site gegevens -1
Nee
Nee
Nieuwe revisie
Ja
Ja
Revisie omschrijving wordt “LEF 0”
Revisie omschrijving en tekenaar door gebruiker
Datum aanpassen bij laatste revisie in tekeninghoofd
Revisie nummer wordt met 1 verhoogd
Schaal Tekenaar en site gegevens uit blok site gegevens lezen
Revisie invullen in tekeninghoofd
Revisie nummer in blok site gegevens plaatsen
Figuur 5: Stroomschema tekenhoofd invullen
Door de attributen op te vragen van de verschillende blokken en de tagnaam te vergelijken worden de attributen uitgelezen en ingevuld. 26
'Haalt site nummer en site adres uit blok site gegevens en plaatst deze in tekeninghoofd Public Sub Tekh_invullen() Dim selset_sitegeg As AcadSelectionSet Dim Selset_tekh As AcadSelectionSet Dim sitenr_waarde As String Dim adres_waarde As String Dim plaats_waarde As String Dim el As AcadBlockReference Dim attr As Variant Dim I As Integer Dim SNR As String Dim ADR As String Set selset_sitegeg = Sel_Blok("site_geg_vb") For Each el In selset_sitegeg attr = el.GetAttributes sitenr_waarde = attr(0).TextString adres_waarde = attr(1).TextString plaats_waarde = attr(2).TextString Next ADR = adres_waarde + ", " + plaats_waarde Set Selset_tekh = Sel_Blok("kader*") For Each el In Selset_tekh attr = el.GetAttributes For I = LBound(attr) To UBound(attr) If attr(I).TagString = "SITENR" Then attr(I).TextString = sitenr_waarde End If If attr(I).TagString = "ADRES" Then attr(I).TextString = ADR End If Next Next End Sub
Voordat de revisie wordt ingevuld wordt eerst de huidige revisie bepaald. Deze wordt als onzichtbare attribuut in het blok "site_geg_vb" weggeschreven en heeft als standaard waarde –1. Omdat nadat een tekeningen pakket af is deze niet altijd direct verstuurd wordt heeft de gebruiker ook de mogelijkheid om alleen de datum van de huidige revisie aan te passen en geen nieuwe revisie toe te voegen. Deze keuzemogelijkheid wordt mogelijk gemaakt met behulp van een userform waarop ook een eventuele revisie omschrijving en de tekenaar kan worden ingevuld.
Om altijd dezelfde datumnotitie in het tekeninghoofd te plaatsen hebben wij hiervoor een functie geschreven zodat dag maand en jaar altijd door twee cijfers wordt weergegeven.
27
'Geeft een datum als dd-mm-jj Public Function vand() Dim a As String a = Date If Len(a) = 8 Then a = "0" + a If Len(a) = 9 Then If Mid(a, 3, 1) = "-" Then vand = Mid(a, 1, 3) + "0" + Mid(a, 4, 2) + Mid(a, 8, 2) Else vand = "0" + Mid(a, 1, 5) + Mid(a, 8, 2) End If Else vand = Mid(a, 1, 6) + Mid(a, 9, 2) End If End Function
Om altijd de juiste schaal in het tekeninghoofd weer te geven hebben wij een subroutine geschreven voor het bepalen en het in het tekeninghoofd plaatsen van de schaal (zie figuur 6).
28
Invullen tekeninghoofd
Layout tekeninghoofd opvragen
Volgende tekeninghoofd
Layout viewports opvragen
Volgende viewport Nee
Viewport op dezelfde layout als tekeninghoofd
Nee
Ja Laatste viewport
Schaal sorteren en dubbele schalen en 1:1 uitfilteren
Ja Schaal in lijst plaatsen
Tekst string samenstellen uit lijst met schalen
Tekst in tekeninghoofd plaatsen
Laatste tekeninghoofd
Nee
Ja Invullen tekeninglijst
Figuur 6: Stroomschema schaal
Door de OwnerID van het tekeninghoofd te vergelijken met de Owner ID van de viewport wordt bepaald of tekeninghoofd en viewport op dezelfde layout staan. Door de betreffende layout en viewport actief te maken kan de verschalingsfactor ten opzichte van modelspace worden bepaald. Door één te delen door deze verschalingsfactor kun je de schaal bepalen. 'zet de schaal van de viewports in het tekenhoofd Public Sub Inv_Schaal() Dim Selset_tekh As AcadSelectionSet
29
Dim Selset_vp As AcadSelectionSet Dim el As AcadBlockReference Dim ID_Layout_Kader As Long Dim Ob As Variant Dim schaal(0 To 10) As Double Dim Volg_sch(0 To 10) As String Dim sch As String Dim I As Double Dim J As Double Dim K As Double Dim attr As Variant Dim x As Double Dim y As Double Set Selset_tekh = Sel_Blok("kader-cumae-dt") Set Selset_vp = Sel_vp MsgBox Selset_vp.Count K=0 For Each el In Selset_tekh ThisDrawing.ActiveLayout = ThisDrawing.Layouts(K) On Error Resume Next ThisDrawing.MSpace = True Err.Clear J=0 ID_Layout_Kader = el.OwnerID schaal(0) = 0 schaal(1) = 0 schaal(2) = 0 schaal(3) = 0 schaal(4) = 0 schaal(5) = 0 schaal(6) = 0 schaal(7) = 0 schaal(8) = 0 schaal(9) = 0 schaal(10) = 0 For Each Ob In Selset_vp If Ob.OwnerID = ID_Layout_Kader Then On Error Resume Next ThisDrawing.ActivePViewport = Ob If 1 / ThisDrawing.ActivePViewport.CustomScale _ - Fix(1 / ThisDrawing.ActivePViewport.CustomScale) < 0.5 Then schaal(J) = Fix(1 / ThisDrawing.ActivePViewport.CustomScale) Else schaal(J) = Fix(1 / ThisDrawing.ActivePViewport.CustomScale) + 1 End If Err.Clear J=J+1 End If Next ThisDrawing.MSpace = False K=K+1 'sorteren van de schalen en dubbele schalen en schaal 1:1 verwijderen Volg_sch(0) = 1000000 Volg_sch(1) = 1000000 Volg_sch(2) = 1000000 Volg_sch(3) = 1000000 Volg_sch(4) = 1000000 Volg_sch(5) = 1000000 Volg_sch(6) = 1000000 Volg_sch(7) = 1000000 Volg_sch(8) = 1000000 Volg_sch(9) = 1000000
30
Volg_sch(10) = 1000000 For I = 0 To UBound(schaal) If schaal(I) = 1 Or schaal(I) = 0 Or schaal(I) = Volg_sch(0) _ Or schaal(I) = Volg_sch(1) Or schaal(I) = Volg_sch(2) _ Or schaal(I) = Volg_sch(3) Or schaal(I) = Volg_sch(4) _ Or schaal(I) = Volg_sch(5) Or schaal(I) = Volg_sch(6) _ Or schaal(I) = Volg_sch(7) Or schaal(I) = Volg_sch(8) _ Or schaal(I) = Volg_sch(9) Or schaal(I) = Volg_sch(10) _ Then GoTo Overslaan
If schaal(I) < Volg_sch(0) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = Volg_sch(7) Volg_sch(7) = Volg_sch(6) Volg_sch(6) = Volg_sch(5) Volg_sch(5) = Volg_sch(4) Volg_sch(4) = Volg_sch(3) Volg_sch(3) = Volg_sch(2) Volg_sch(2) = Volg_sch(1) Volg_sch(1) = Volg_sch(0) Volg_sch(0) = schaal(I) Else If schaal(I) < Volg_sch(1) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = Volg_sch(7) Volg_sch(7) = Volg_sch(6) Volg_sch(6) = Volg_sch(5) Volg_sch(5) = Volg_sch(4) Volg_sch(4) = Volg_sch(3) Volg_sch(3) = Volg_sch(2) Volg_sch(2) = Volg_sch(1) Volg_sch(1) = schaal(I) Else If schaal(I) < Volg_sch(2) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = Volg_sch(7) Volg_sch(7) = Volg_sch(6) Volg_sch(6) = Volg_sch(5) Volg_sch(5) = Volg_sch(4) Volg_sch(4) = Volg_sch(3) Volg_sch(3) = Volg_sch(2) Volg_sch(2) = schaal(I) Else If schaal(I) < Volg_sch(3) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = Volg_sch(7) Volg_sch(7) = Volg_sch(6) Volg_sch(6) = Volg_sch(5) Volg_sch(5) = Volg_sch(4) Volg_sch(4) = Volg_sch(3) Volg_sch(3) = schaal(I) Else If schaal(I) < Volg_sch(4) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = Volg_sch(7) Volg_sch(7) = Volg_sch(6) Volg_sch(6) = Volg_sch(5) Volg_sch(5) = Volg_sch(4) Volg_sch(4) = schaal(I) Else If schaal(I) < Volg_sch(5) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = Volg_sch(7) Volg_sch(7) = Volg_sch(6) Volg_sch(6) = Volg_sch(5) Volg_sch(5) = schaal(I) Else If schaal(I) < Volg_sch(6) Then
31
Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = Volg_sch(7) Volg_sch(7) = Volg_sch(6) Volg_sch(6) = schaal(I) Else If schaal(I) < Volg_sch(7) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = Volg_sch(7) Volg_sch(7) = schaal(I) Else If schaal(I) < Volg_sch(8) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = Volg_sch(8) Volg_sch(8) = schaal(I) Else If schaal(I) < Volg_sch(9) Then Volg_sch(10) = Volg_sch(9) Volg_sch(9) = schaal(I) Else Volg_sch(10) = schaal(I) End If End If End If End If End If End If End If End If End If End If Overslaan: Next 'Tekst zoals in tekeninghoofd moet worden geplaatst samenstellen If Volg_sch(0) = 1000000 Then sch = "n.v.t." Else sch = "1:" + Volg_sch(0) For I = 1 To 10 If Volg_sch(I) <> 1000000 Then sch = sch + " / " + Volg_sch(I) End If Next End If 'Tekst in tekeninghoofd plaatsen attr = el.GetAttributes For I = 0 To UBound(attr) If attr(I).TagString = "SCHAAL" Then attr(I).TextString = sch End If Next Next End Sub
4.2.3 Tekeningenlijst genereren Als laatste wordt de uiteindelijke tekeningenlijst gegenereerd (zie figuur 7).
32
Schaal
Layouts sorteren
Aantal tekeninghoofden tellen
Tekeninghoofden uitlezen in een lijst
Regels bestaande tekeningenlijst verwijderen
Ja Einde
Aantal regels gelijk aan aantal tekeninghoofden
Nee
Regel aan tekeningenlijst toevoegen
Regel invullen
Figuur 7: Stroomschema invullen tekeningenlijst
Om de juiste volgorde van de tekeningen in de tekeningenlijst te krijgen moeten voordat de tekeningenlijst wordt gegenereerd eerst de layouts worden gesorteerd op naam. De naam van iedere layout wordt een voor een in de lijst geplaatst nadat gekeken is op welke plaats hij hoort te staan. Dit is een alfabetische lijst. Hierna worden de layouts op volgorde geplaatst. ' Sorteert de layouts naar "alfabetische" volgorde Function Layout_volgorde() Dim SortLayoutLijst As New Collection Dim LayoutTeller As Long Dim SortTeller As Long Dim LayoutVolgorde As Long Dim LayoutNaam As String Dim SortText As String Dim SortLayout As AcadLayout Dim LayoutToegevoegd As Boolean
33
For LayoutTeller = 0 To (ThisDrawing.Layouts.Count - 1) LayoutToegevoegd = False LayoutNaam = ThisDrawing.Layouts(LayoutTeller).Name If LayoutNaam = "Model" Then GoTo Overslaan If SortLayoutLijst.Count = 0 Then SortLayoutLijst.Add LayoutNaam Else For SortTeller = 1 To SortLayoutLijst.Count SortText = SortLayoutLijst(SortTeller) If StrComp(LayoutNaam, SortText, vbTextCompare) = -1 Then If SortTeller = 1 Then SortLayoutLijst.Add LayoutNaam Else SortLayoutLijst.Add LayoutNaam, , SortTeller End If LayoutToegevoegd = True Exit For End If Next If Not (LayoutToegevoegd) Then SortLayoutLijst.Add LayoutNaam, , , SortLayoutLijst.Count End If Overslaan: Next For SortTeller = 1 To SortLayoutLijst.Count Set SortLayout = ThisDrawing.Layouts(SortLayoutLijst(SortTeller)) SortLayout.TabOrder = SortTeller Next End Function
Voordat de tekeningenlijst kan worden gemaakt moeten eerst de tekenhoofden worden uitgelezen in een lijst. Door de attributen op tagnaam te selecteren en de waarde van deze attributen op een vaste plaats in de lijst te plaatsen kun je de volgorde van de lijst bepalen. 'Lees bladnummer, Titel en revisiedata uit de verschillende tekenhoofden en plaatst 'deze in een array Public Sub Atrib_uitlezen() Dim Selset_tekh As AcadSelectionSet Dim el As AcadBlockReference Dim attr As Variant Dim I As Integer Dim J As Integer Dim K As Integer Dim attrvar() As String Dim d As String Dim a d="" Set Selset_tekh = Sel_Blok("kader*") K = Selset_tekh.Count * 10 - 1 ReDim attrvar(0 To K) As String J=0 For Each el In Selset_tekh attr = el.GetAttributes For I = LBound(attr) To UBound(attr)
34
If attr(I).TagString = "TEKNR" Then attrvar(J) = attr(I).TextString End If If attr(I).TagString = "OMSCHR" Then attrvar(J + 1) = attr(I).TextString End If If attr(I).TagString = "DATUM0" Then attrvar(J + 2) = attr(I).TextString End If If attr(I).TagString = "DATUM1" Then attrvar(J + 3) = attr(I).TextString End If If attr(I).TagString = "DATUM2" Then attrvar(J + 4) = attr(I).TextString End If If attr(I).TagString = "DATUM3" Then attrvar(J + 5) = attr(I).TextString End If If attr(I).TagString = "DATUM4" Then attrvar(J + 6) = attr(I).TextString End If If attr(I).TagString = "DATUM5" Then attrvar(J + 7) = attr(I).TextString End If If attr(I).TagString = "DATUM6" Then attrvar(J + 8) = attr(I).TextString attrvar(J + 9) = " " End If Next J = J + 10 Next Call inv_inhoud(attrvar, K) End Sub
Als laatste worden eerst de aanwezige tekeningenlijst (zonder titelblok) verwijderd, waarna voor iedere tekening een regel wordt toegevoegd en ingevuld. Doordat de lengte van de lijst bekend is, is het aantal tekeningen en dus het aantal benodigde regels te bepalen. Door regel voor regel te plaatsen en direct in te vullen wordt de juiste volgorde aangehouden. Als alle regels eerst worden geplaatst en daarna worden ingevuld is de volgorde van invullen gelijk aan de volgorde van selecteren van de blokken door de applicatie. 'Verwijderd de aanwezige inhoudsopgave en plaatst een nieuwe 'gebruikt de array uit Atrib_uitlezen en plaatst deze in de nieuwe inhoudsopgave Public Sub inv_inhoud(ByRef attrvar() As String, K As Integer) Dim selset_inh As AcadSelectionSet Dim el As AcadBlockReference Dim attr As Variant Dim I As Integer Dim I1 As Integer Dim J As Integer Dim lay As AcadLayout
35
Dim punt(0 To 2) As Double punt(0) = 150 punt(1) = 165 punt(2) = 0 ThisDrawing.SetVariable "ctab", "0.0" Set selset_inh = Sel_Blok("inhoud_regel") selset_inh.Erase J=0 For I = 0 To K Step 10 Set el = InsBlTab(punt, "inhoud_regel", 1, 1, 0) attr = el.GetAttributes For I1 = LBound(attr) To UBound(attr) attr(I1).TextString = attrvar(J) J=J+1 Next punt(1) = punt(1) - 4 Next End Sub
36
5 Handleiding voor de applicaties 5.1 Antenne frame Na het starten van de applicatie wordt doormiddel van een userform (zie figuur 8) invoer van de gebruiker gevraagd.
Figuur 8: Userform T-frame
Behalve de afmeting kan men ook het tekeningnummer uit een lijst kiezen of een nummer invoeren. Verder kan men ook de schoor links of rechts van de paal plaatsen. Kiest men anders dan in het voorbeeld “rechts” verschijnt een andere afbeelding met de schoor aan de rechter zijde van de paal.
Na het indrukken van de OK knop wordt de gebruiker gevraagd een punt aan te wijzen in Modelspace. Als het insertionpoint is aangewezen wordt de T-frame, een boven- zijen vooraanzicht, in de tekening geplaatst (zie figuur 9). 37
Figuur 9: Drie aanzichten T-frame
Er is rekening mee gehouden dat de tekening bedoeld is voor de werkplaats en de constructeur, daarom wordt het frame gelijk met dimlijnen en posnummers gegenereerd.
Na het plaatsen van het frame controleert het programma of het de door de gebruiker gekozen tabbladnummer reeds bestaat. Is dit het geval verschijnt er een waarschuwing (zie figuur 10).
Figuur 10: Mesagebox tabblad alert 38
Nadat de gebruiker gewaarschuwd is kan hij in een userform (zie figuur 11) kiezen uit twee verschillende opties.
Figuur 11: Userform tabblad verwijderen / hernoemen
Hierin kan men kiezen om het bestaande tabblad te verwijderen of een ander nummer in te voeren voor het nieuwe tabblad.
De OK knop kan pas worden ingedrukt wanneer er gekozen is voor het bestaande tabblad te verwijderen of er een nog niet voorkomend tabbladnummer is ingevoerd. Mocht de gebruiker zich alsnog vergissen en weer een reeds bestaand tabbladnummer invoeren verschijnt er een andere waarschuwing (zie figuur 12). Dit om er zeker van te zijn dat er geen werk verloren gaat.
39
Figuur 12: Melding ander bladnummer Staat eenmaal vast wat het eerste nummer is van de drie tabbladen zet het programma vervolgens achter de daarop twee volgende bladen (zie figuur 13).
Door gebruiker ingevoerd nummer. Figuur 13: Aangemaakte tabbladen
Tijdens het invullen worden de waardes voor de verschillende maten in de het plaatje geplaatst, zodat de tekenaar kan controleren of hij de maten op de juiste plek invoert Als alle maten zijn ingevoerd en de tekenaar op OK drukt wordt het insertion point van het frame gevraagd. Aan de hand van dit punt en de ingevoerde waardes worden alle punten van het frame berekend en wordt een bovenaanzicht een vooraanzicht en een zijaanzicht getekend tevens worden de details met de maatvoering in de tekening geplaatst, waarna de aanzichten en de details op de juiste layout in een kader worden geplaatst. Op het kader wordt tevens een pos lijst geplaatst en ingevuld.
40
5.2 Tekeningenlijst Met behulp van deze applicatie worden de tekeninghoofden inclusief revisies ingevuld en hierna wordt op het voorblad “0.0” de tekeningenlijst gegenereerd. Door gebruik te maken van deze applicatie hoeft in het tekeninghoofd alleen de omschrijving van de tekening ingevuld te worden. Omdat de standaard beschrijvingen al in de template aanwezig zijn is dit alleen nodig bij afwijkende tekeningen.
Na het starten controleert de applicatie of de juiste layout en het juiste blok aanwezig is. Zo niet worden ze geplaatst. Om later de layouts in de goede volgorde te kunnen krijgen worden eerst alle layouts hernoemt en krijgen dezelfde naam als het tekeningnummer op de layout. Dit is direct een controle of alle bladen een ander tekening nummer hebben. Als twee bladen hetzelfde tekeningnummer hebben krijgt de tekenaar een foutmelding (zie figuur 14) en wordt de applicatie afgebroken.
Figuur 14: Melding twee keer hetzelfde tekeningnummer
Hierna wordt de tekenaar gevraagd een userform (zie figuur 15) in te vullen met de site gegevens. In deze userform worden de site gegevens uit het blok “site_geg_vb” geplaatst. Als er nog geen site nummer is ingevuld wordt het site nummer de tekeningnaam (zonder “.dwg”). De initialen van de tekenaar worden uit de setvar “Loginname” gelezen. Omdat wij met verschillende versies van Windows werken is de login naam niet altijd de initialen van de tekenaar, daarom moet deze toch worden ingevuld c.q. gecontroleerd.
41
Figuur 15: Userform site gegevens
De site gegevens worden in het blok “site_geg_vb” geplaatst waarna deze weer worden uitgelezen en in de verschillende tekeninghoofden worden geplaatst. Als de site gegevens al zijn ingevuld krijgt de tekenaar op een message box (figuur 16) de vraag of deze gewijzigd moeten worden.
Figuur 16: Message box site gegevens aanpassen?
Hierna wordt uit het blok “site_geg_vb” het huidige revisienummer gelezen, waarna als er geen revisie nummer is automatisch revisie 0 wordt geplaatst. Als er wel een revisie nummer is wordt er met behulp van een userform (zie figuur 17) gevraagd naar een nieuwe revisie of de datum aanpassen.
42
Figuur 17: Userform Revisie
Nu wordt of de huidige datum of een nieuwe revisie in de revisie lijst geplaatst. Hierna worden de schalen van de verschillende tekeningen in het tekeninghoofd geplaatst. Om de juiste volgorde in de tekeningenlijst te verkrijgen worden de Layouts eerst gesorteerd op naam (alfabetische volgorde). Hierna worden alle attributen van de tekeninghoofden uitgelezen en de bladnummers, titels en revisiedata in de tekeningenlijst geplaatst.
43
6 Conclusie De eerder verwachte tijdwinst is gerealiseerd. Het tekenen van een T-frame is terug gebracht naar ca. 5 minuten in plaats van de geschatte 10 minuten en het invullen van de tekeningenlijst neemt nu nog maar ca. 1 minuut in beslag.
Het verder uitbreiden van het menu, zoals frames voor de apparatuur, uitprinten van tekeningen, invullen van diverse schema’s en dergelijke, zal nog meer tijdwinst geven.
Ook de mogelijkheid om (gedeeltes van) het menu voor andere afdelingen te gebruiken (eventueel na kleine wijzigingen) is nog niet bekeken, maar wellicht mogelijk.
44
Literatuurlijst Boeklage, R AutoCAD 2002 computer ondersteund ontwerpen Nijmegen, 2002
Boeklage, R AutoCAD VBA Gevorderden Nijmegen, 2003
Autodesk AutoCAD 200 ActiveX and VBA developer’s guide z.pl., 1999
45
Bijlage 1: Voorbeeld tekeningenlijst
Bijlage 2: Voorbeeld tekeningen T-frame