DATA EXTRACTIE
Data extractie Data extractie van lijnlengtes (of aantallen) van AutoCAD tekeningen naar Excel door middel van VBA routines.
Auteur:
P. Verkade
Onderwerp:
Data extractie
Opdrachtgever:
R.E.T. afdeling Beheer en Ontwikkeling
Opleiding:
TEC / CAD College
Locatie:
Nijmegen
Richting:
ACE System manager
Begeleidend docent:
Dhr. Ir. R. Boeklagen
Datum:
November 2009
Voorwoord Ik ben Patrick Verkade, werkzaam bij de RET vanaf januari 2000. Ik ben 40 jaar, getrouwd met Anna. Samen hebben we een dochter, Lina genaamd, en zij is nu 2,5 jaar oud.
In teamverband werken ik bij het ingenieursbureau van de RET. Ons aandeel betreft spoor, zowel tram als metroprojecten. Wij verzorgen kennis overdracht, middels voorschriften en tekeningen waarin onze aanbeveling en voorwaarden weergegeven worden. Het varieert van overzicht tot detaillering van allerlei onderwerpen die met tram en metro gerelateerd zijn. Ook sturen wij vernieuwingsprojecten en onderhoudsprojecten aan.
Een opdracht is verkregen vanuit de afdeling ‘Beheer en ontwikkeling’ van de RET, tijdens het werken in de projecten.
De opdracht is om hulpmiddelen te creëren om tijdens opbouw van projecttekeningen sneller en effectiever lengtes van de verschillende constructies van de trambaan te bepalen en om deze over te halen naar ramingstaten in Excel. Ik wil bereiken dat het bepalen van de hoeveelheden nauwkeurig verloopt, ook bij wijzigen van het originele uitgangspunt tijdens een lopend project.
Hiervoor is onderzoek gedaan. En de gedane ervaring en conclusie zijn in dit verslag verwoord.
Ik wil hierbij Ronald, Paul en Leonie bedanken voor hun kennisoverdracht en ondersteuning. Pieter en de afdeling voor hun enthousiasme. Anna voor haar support en geduld.
4
Inhoudsopgave Data extractie ................................................................................................................. 3 Voorwoord....................................................................................................................... 4 Inhoudsopgave............................................................................................................... 5 Samenvatting.................................................................................................................. 6 1.0 Inleiding ............................................................................................................... 7 1.1 Opbouw ingenieursbureau ............................................................................... 9 2.0 Werkwijze Spoorbouw .................................................................................... 13 2.1 Probleemstelling............................................................................................... 15 3.0 Oplossingen...................................................................................................... 17 4.0 Hulpmiddelen.................................................................................................... 20 4.1 De ‘breek’ oplossing ........................................................................................ 22 4.2 Tabellen............................................................................................................. 24 4.3 Programma stroomschema ............................................................................ 25 4.4 VBA routine....................................................................................................... 27 4.5 Excel .................................................................................................................. 35 4.6 Toolpalette ........................................................................................................ 37 5.0 Conclusies en aanbeveling ............................................................................ 39 Nawoord ........................................................................................................................ 40 Literatuurlijst ................................................................................................................. 41
5
Samenvatting Het ingenieursbureau van de RET is ondergebracht in de afdeling ‘Beheer en Ontwikkeling’. Het heeft te maken met groeiperikelen, hiermee duiden ik op een deel automatisering wat aan groei onderhevig is en waardoor efficiënter gewerkt kan worden.
In dit verslag ligt de nadruk op het nauwkeurig hoeveelheden bepalen van de lengte van een project, en de connectie met Excel. Er is gekozen voor een oplossing middels VBA om lengtes te bepalen en de overdracht naar Excel te realiseren. Er wordt uitleg gegeven aan de huidige situatie en de problemen die zich voordoen. Men wordt tijdens het lezen van het verslag meegenomen naar een stukje onderzoek en naar goede werkbare oplossingen.
Het resulteert in een complete werkset van hulpmiddelen welke de snelheid en accuraatheid van de data zeer sterk zullen bevorderen. Het resultaat mag er zeker zijn, de snelheid en efficiëntie zullen vele malen verhoogd worden.
6
1.0 Inleiding De RET is het vervoersbedrijf van Rotterdam. Een kleine honderd jaar geleden begonnen als paardentram, ontwikkeld tot een moderne vervoerder die ± 600.000 mensen per dag vervoert. Een lengte metrobaan van 95 km, trambaan van ongeveer 196 km en 1800 halteplaatsen voor de bus, waarvan ongeveer 1100 voorzien zijn van een abri. De verdeling voor bijvoorbeeld de halteplaatsen is als volgt; - 660 abri’s op bushaltes RET - 112 abri’s op tramhaltes - 172 abri’s op tramplus haltes - 84 abri’s op streekvervoer bushalten hier rijden niet RET bussen (Ariva, Kubus Connextion etc.) - 1 abri ten behoeve van toerbussen, denk aan kras reizen etcetera. - de rest is niet voorzien van een abri, dit zijn uitstaphaltes.
De RET vervoert mensen in Rotterdam en randgemeenten zoals, Capelle aan de IJssel, Barendrecht, Schiedam, Vlaardingen, Nieuwerkerk aan de IJssel, Rhoon, Spijkenisse en sinds een jaar is er een verbinding met de lightrail, Randstadrail, naar Zoetermeer en Den Haag. Geplande uitbreidingen zijn de tramverbinding naar Ridderkerk, en de lightrailverbinding naar Hoek van Holland.
Het ingenieursbureau was vanaf het begin een onderdeel van het concern. In het verleden, tot in de 80e jaren was er een eigen buigfaciliteit aanwezig en werden er op eigen terrein sporen voor metro en tram gebogen, met tekeningen gefabriceerd door het ingenieursbureau van het bedrijf.
Tegenwoordig in de trend om meer uit te besteden en al het buigwerk is van de RET terreinen verdwenen.
Om snel en goed te kunnen bepalen hoeveel spoorstaaf we nodig hebben, en in welke ondergrond deze ligt ,is er een stuk gereedschap nodig wat bij deze tijd hoort. 7
Een introductie van het bedrijf en een weergave van de werkwijze zal meer duidelijkheid geven van het gevraagde en zal ook inzichtelijk maken waar het knelpunt zich bevind. De lezer wordt meegenomen in een op maat gemaakte oplossing en een werkbare omgeving waarin de gebruiker met minimale inspanning het maximale kan bereiken.
8
1.1 Opbouw ingenieursbureau De RET is vanouds al bezig om met een eigen ingenieursbureau het tramspoor en het metrospoor en bushalten te ontwikkelen en te optimaliseren. Bij de eerste opzet heeft de RET al een ingenieursbureau waar men de tekeningen zelf maakt en bijhoud. De tekeningen bevatten alle gegevens die nodig zijn om een vervoersbedrijf te ondersteunen.
Het ingenieursbureau is onderverdeeld in meerdere specialisaties, namelijk; -
Stations en gebouwen
-
Elektrische installaties en Tractie
-
Spoorbouw
-
Materieel.
Elke subcategorie heeft zijn eigen tekeningen, die onderhouden worden, en worden opgeslagen in een database. Deze tekeningen bevatten plattegronden, samenstellingstekeningen, detailtekeningen, schema’s en tabellen.
Als we een tipje van de sluiter oplichten welke tekeningen door de onderafdelingen gemaakt worden, krijgen we een volgende opsomming:
1. Stations en gebouwen -
Metrostations
-
Gelijkrichterstations (het pand zelf)
-
Kantoorpanden
-
Werkplaatsen
-
Remises
9
2. Elektrische installaties en Tractie -
Installatie schema’s voor gelijkrichterstations
-
Installatie schema’s voor relaisruimten
-
Metro beveiliging
-
Wisselaansturing
-
Voedingsschema’s voor tram en metro
3. Spoorbouw -
Metro en tramspoor
-
Tramhalten en bushalten
-
Rail bevestiging details
-
Tram en metro constructies (baan opbouw)
-
Buis en kokersystemen
4. Materieel -
Samenstelling tekeningen van bussen, metro’s en trams
-
Onderdeel tekeningen van bussen, metro’s en trams
-
Materiaalbepaling van bovenstaande
Als ik naar de hoeveelheid tekeningen kijk op de afdeling waar ik werk, spoorbouw, dan loopt mijn zoekactie vast op de 10.000 tekeningen. Hij stopt hierbij omdat dat dit het maximale aantal is wat de zoekmachine aan kan per opdracht.
Op de volgende twee pagina’s ziet men een organigram van het ingenieursbureau, waarbij ik zelf ingedeeld ben onder het kopje ‘spoorwegtechniek’.
10
11
12
2.0 Werkwijze Spoorbouw
Alle afdelingen hebben hun tekeningen van groot object tot detailvorming. Het merendeel is gedigitaliseerd en alles wordt opgeslagen in een database.
Op onze afdeling spoorbouw circuleren projecttekeningen, detail en samenstellingtekeningen. De projecttekeningen worden veelal gemaakt op ondergronden van de gemeente Rotterdam, deze worden aangeleverd in “DWG” formaat, kaarten van 1000m bij 800m en in een raster weergegeven welke over de stad Rotterdam ligt. Het zijn bovenaanzichten met de bestaande en nieuwe ligging van de metro en trambaan of een halte inrichting. Detailtekening kunnen allerlei informatie bevatten, van aanvullende informatie voor een project, specifieke aanzichten, tot samenstellingstekeningen van de stroomrail.
Voor dit project valt de focus op het werken in de projectsfeer en in bijzonder het bepalen van de lengte trambaan bij nieuwe aanleg of vervangen van bestaande baan.
Op de afdeling wordt het spoor uitgewerkt en vermelden we de lengte van de baan op de tekening in een tabel (zie bijlage 1). De lengte wordt onderverdeeld in zogenoemde ‘constructiecodes’. Deze codes vertellen iets over de opbouw van de baan.
Een constructiecode is een code bestaande uit 3 cijfers, welke refereren naar één specifieke baanopbouw. De code hangt ook van aan een detailtekening waarin de baanopbouw wordt weergegeven (zie bijlage 2.) Een baanopbouw bestaat uit een aanzicht waarin men vanaf een cunet (zandbed), het spoor opbouwt.
13
Bijvoorbeeld, kijkende naar de bijlage: -
cunet
-
Dwarsligger
-
Onderlaag beton
-
Spoor met bevestigingsmiddelen
-
Bovenlaad beton
-
Toplaag van elementen
Elke unieke samenstelling heeft zijn eigen constructiecode.
Op de projecttekening wordt aangegeven van waar tot waar de constructiecode gebruikt wordt. De lengtes van al deze codes tezamen, is de lengte van het totale project, de vernieuwing van een tram of metrospoor. (zie bijlage 3.)
Deze lengte komt op de tekening te staan, in de tabel, en wordt tevens gebruikt om een raming te creëren. Deze lengtes worden doorgegeven aan de werkvoorbereiding waarmee zij de materiaalhoeveelheden bepaalt. Hierbij moet men denken aan bevestigingsmiddelen, dwarsligger, meter spoor, kabelgoot systemen, kubieke meter beton, asfalt etc.
De werkvoorbereiders werken met een eigen Excel sheet, waarin de lengtes van de constructiecodes worden ingevoerd en direct alle materialen uitgetrokken worden.
14
2.1
Probleemstelling
Om tot een duidelijk beeld te komen van de lengte van de constructiecodes wordt er nu handmatig gemeten. Dit wordt in de regel gedaan met behulp van het plaatsen van maatlijnen tussen de grenzen van de constructiecodes, en de totalen op te maken. Dit geeft een aardige nauwkeurigheid weer. Doch met enige regelmaat komt het voor dat de lengtes bepaald worden door te meten van een afgedrukte tekening, hiervoor wordt een schaalstok gebruikt, waardoor de nauwkeurigheid flink terug loopt.
Voor beiden methoden staat vast er tijd ingestoken moet worden om de lengte te bepalen. Er zal altijd tijd in een actie gestoken moeten worden, maar de hoeveelheid tijd kan drastisch omlaag en de nauwkeurigheid flink omhoog.
Het wordt lastig als er in het project andere keuzes gemaakt worden, en wordt afgeweken van de uitgangspositie. Hieruit volgt dat er wellicht andere constructies gebruikt zullen worden en er zullen andere lengtes uit voort vloeien.
De bovenstaande acties zullen handmatig herhaald moeten worden waardoor de kans op fouten en afwijkingen nog groter zullen worden.
De ‘simpele’ mannier die gebruikelijk gehanteerd word is het ‘plussen en minnen’. Het verschil in lengtes, van de constructiecode, optellen of aftrekken van het geheel. Waarbij niet meer te achterhalen is, waar en hoe, de afrondingen in een eerder stadium hebben plaatsgevonden.
Er wordt afgerond op hele meters. Aangezien je nooit te kort mag bestellen, het is slordig als je plots een onderbreking van een paar meter in je spoor heb, wordt er altijd naar boven afgerond.
15
Bij ‘plussen en minnen’ is onnauwkeurigheid 100% aanwezig en kan het zo zijn dat er tientallen meters teveel worden opgegeven, zeker bij grote en middelgrote projecten. Hierdoor wordt een project onnodig belast. De aannemers daarin tegen houden materiaal over en zij kunnen hiermee het kostenplaatje drukken, zeker gezien de ijzerprijzen van de tijd.
De onnauwkeurigheid vermenigvuldigd zich door in bevestigingsmaterialen, beton etc.
Hier wil ik iets aan doen, om nauwkeuriger en sneller de hoeveelheden, de raming en de materiaalhoeveelheden te kunnen verzorgen.
16
3.0 Oplossingen Om het geschetste probleem effectief aan te pakken, is het gekozen om in AutoCAD, bij de basis van het maken van de lengte bepaling, de oplossing te zoeken.
Er zijn meerdere oplossingen mogelijk binnen het programma. Deze zijn;
1. handmatig maatvoeren. 2. werken met tabellen met velden. 3. maatwerk met VBA.
De mogelijkheden nader toegelicht;
1. Handmatig maatvoeren.
Zoals in het hoofdstuk probleemstelling is geschetst heeft handmatig maatvoeren de volgende voor en nadelen.
Voordelen:
- snel. - simpel, iedereen kan het.
Nadelen:
- onnauwkeurig. - veranderd niet mee na een verandering.
2. Werken met tabellen met velden.
Het werken met tabellen met velden geeft zeker voordelen ten opzichte van handmatig maatvoeren, maar ook zijn beperking. Het heeft een mooie weergave in een tabel, en kan door iedereen gebruikt worden.
17
En er kunnen standaard veld instellingen gemaakt worden in een tabel welke direct aangesproken kunnen worden door elke gebruiker. Helaas is het meer een ‘tool’ welke een mooie weergave geeft met de informatie, op zich zelf mist het de rekenkracht die we nodig hebben om de lijnlengtes te kunnen bepalen.
Voordelen:
- duidelijke weergave. - iedereen achter een AutoCAD station kan het gebruiken. - een standaard is te creëren dus altijd dezelfde weergave. - mogelijkheid om data te exporteren Excel.
Nadelen:
- Heeft zijn beperking in rekenkracht. - Er is nog steeds VBA nodig om de berekeningen uit te voeren, een tabel op zich kan de berekening niet aan.
3. Werken met VBA
Het werken met VBA in deze context, is een investering die zichzelf zo snel terugverdiend dat het eigenlijk niet meer aantrekkelijk is om de voorgaande opties serieus uit te werken. De samenwerking met een tabel is een optie, doch heeft men gekozen om met de standaard tabellen op de afdeling te werken.
Natuurlijk is programmeren tijdrovend, dit is eenmalig, hierna is het één druk op de knop voor een gebruiker om de data uit de tekening te filteren en zowel naar de tabel in de tekening als naar een Excel sheet te transporteren.
Voordelen:
- het programma telt; foutief tellen of afronden is verleden tijd. - hertellen is snel en accuraat. - uittrekken van data is razendsnel. - overtypen in Excel is niet meer nodig, minder kans op fouten. - VBA is modulair. - geeft direct de lengte in de tabel op.
18
Nadelen:
- Iemand op zaal moet enig verstand van VBA hebben, om te programmeren, te onder houden en uit te breiden.
Er is aangegeven dat VBA modulair is, hiermee wordt bedoeld dat de opbouw van het programma bepaalde modules, bouwstenen, bevat. Hiermee is het snel uit te breiden en aan te passen voor andere hoeveelheid bepalingen.
De VBA wordt routine als volgt opgebouwd: -
naam / onderwerp.
-
definitie van variabele.
-
de acties .
-
einde.
Dit is natuurlijk versimpeld omschreven, de bedoeling is om aan te tonen, dat de acties, bijvoorbeeld het tellen van lijnen heel snel te kopiëren zijn. Deze zijn op hun beurt, te hernoemen naar hun nieuwe doel, en weer te geven in een eigen, unieke, tabel. Hierdoor is snel te realiseren dat bijvoorbeeld ook kabellengte te tellen en weer te geven zijn, of het aantallen blokken die gebruikt zijn in en een tekening.
De keuze valt op VBA in combinatie met hulpmiddelen zoals, -
toolpalette.
-
commando’s.
-
blokken.
19
4.0 Hulpmiddelen Om snel en effectief met de VBA routine te kunnen werken zijn hulpmiddelen nodig, tools. De as van het spoor zal dadelijk de lengte bepalen van de constructiecodes, deze is dus leidend.
Vanuit het subprogramma ‘Bentley Railtrack’, een spoor modelleer pakket, wordt de as gecreëerd met boogstralen en voorwaarden die volgens de RET standaard gewoon zijn. De as wordt als polyline gegenereerd, en deze is dus in één klap te kopiëren en terug te plaatsen op zijn originele locatie, en te hernoemen naar een eigen laagnaam. Alle andere lagen worden nu tijdelijk op slot gezet ‘gelocked’, middels de layermanager. We gaan nu de polyline op de grenzen van het werk, verassend genoeg de werkgrenzen genoemd, afknippen, trimmen.
De as heeft nu precies de lengte van het project. Het is tijd om de as onder te verdelen in zijn desbetreffende constructiecode, laagnaam. We doen dit met de ‘break’ Functie. We breken de lijn op de gewenste locatie en verplaatsen het lijnstuk naar de juiste layer.
De breakfunctie heeft twee mogelijkheden en één groot en vreemd nadeel. De functie bestaat uit:
1. break at two points 2. break at one point
De eerste optie breekt de lijn tussen twee geselecteerde punten en knipt het lijnstuk tussen de selectie weg. De tweede optie breekt de lijn op de selectie en laat de lijn intact.
20
De tweede optie is voor ons de beste oplossing aangezien het extra handelingen zijn en tijd vergt om de weggeknipte lijnstukken te herstellen.
De ‘break at point’ functie heeft een zeer nadelig effect. Als we een lijn breken op één punt, en we herhalen de functie, door een muisklik of een enter, valt de functie terug van een ‘break at point’ naar een ‘break at two points’ functie!
Dit houd in dat we constant de functie moeten verlaten, bijvoorbeeld met escape, en hem opnieuw moeten aanspreken. Dit zorgt er voor dat de functie eigenlijk onwerkbaar geworden is. Deze actie is zal zeer tijdrovend en irriterend gaan werken, zowel ik als andere gebruikers vinden dit onacceptabel.
21
4.1
De ‘breek’ oplossing
De oplossing voor dit probleem moet gevonden worden. Zonder dit hulpmiddel is de VBA routine gedoemd om te mislukken.
In de mogelijkheden om tot een oplossing heb ik gedacht aan; macro’s, dieselcommando’s en VBA.
In de ‘AutoCAD bijbel’ van R. Boeklagen liep ik direct tegen een ‘gedurfde’ oplossing aan. Ik ben direct de Customize Users Interface ingedoken (CUI), en het ‘Break’ commando opgezocht. En nu komt het, ik heb voor het commando; een asterisk, een ‘*’ geplaatst! En natuurlijk opgeslagen.
Vanaf nu herhaalt het commando zich helemaal, dus ook de ‘^C^C’, de escape, escape functionaliteit. Het commando start zichzelf als het ware constant opnieuw op. Vanaf nu hebben we echt twee verschillende toepassingen voor het breek commando, en een snel en bruikbare tool (zie bijlage 4). In de bijlage zien we ook een weegave uit de aangemaakte toolpalette (bijlage 5), waarin eenzelfde commando terugkomt. De toolpalette is aangemaakt om de aansturing van VBA en hulpmiddelen overzichtelijk te bundelen.
Ik wil aangeven dat ik flink verbouwereerd ben door Autodesk. Ten eerste omdat zij twee functies van het ‘break’ commando aanbieden onder een andere noemer; ‘break at two points’ en ‘break at point’, terwijl de herhaling van de commando’s laat zien dat het maar één commando behelst en geen twee.
22
Ten tweede omdat de oplossing zo simpel en uitermate krachtig is.
Ik heb het zeker niet achterwege gelaten om dit te delen met Autodesk, en aan gegeven dat dit voor toekomstig gebruik een effectieve oplossing kan zijn om zo gebruikers verschillende mogelijkheden van het breek commando aan te kunnen bieden (zie bijlage 6 en 7).
Nu hebben we een bruikbaar hulpmiddel om de polyline op de gewenste punten te kunnen breken, zonder lijnverlies. We kunnen in het commando blijven en achter elkaar door klikken op de locatie waar we de breuk willen hebben. Het overhalen van de lijnstukken naar de juiste laag is snel te realiseren zonder irriterend traag commando.
23
4.2
Tabellen
Om de waarde die met de VBA routine worden uitgerekend overzichtelijk te kunnen weergeven creëren we een tabel. De tabel bevat alle nodige cellen die nodig zijn om de constructiecodes weer te geven (bijlage 8.) Deze tabel wijkt af van de eerder getoonde tabel in het verslag omdat hier alle constructiecodes hun eigen unieke benaming hebben gekregen, en hiermee is het onderscheid gemaakt welke VBA nodig heeft. VBA weet nu welke naam, attribute, waar hoort en wat het voor type variabele het is. Met de ‘attribute editor’ geven we de volgorde van de codes weer, zodat deze ook weer op de juiste mannier corresponderen met de VBA routine.
In de tabel, welke als een ‘block’ zal het fungeren, geven we instellingen mee. Op het moment dat het block wordt geïmporteerd in de tekening, zal direct een hele lagenstructuur naar binnengehaald worden, met alle lagen die nodig zijn om de constructiecodes in hun eigen uniek laag te kunnen plaatsen. Zodat er samen met de bovengenoemde breek functie snel doorgewerkt kan worden. Het block zelf heeft zijn eigen laagnaam, en er wordt een schoon net block binnengehaald wat netjes op het nulpunt opgepakt wordt. Voor alle gebruikte blokken, uit de door mij zelf verzorgde toolpalette staat vast dat: -
alle laagnamen correct gebruikt zijn
-
ze vanuit het nulpunt getekend zijn
-
het basepoint ook op nulpunt ligt
-
er een audit en purge overheen gehaald is voordat ze gebruikt kunnen worden, indien nodig zijn ze vooraf geëxplodeerd
-
alle dynamische voorwaarden ingevuld zijn.
Hiermee gebruiken we altijd ‘schone’ en bruikbare tools.
24
4.3
Programma stroomschema
Het programma stroomschema is vrij rechtlijnig aangezien er niet veel keuzemogelijkheden voor de gebruiker aanwezig zijn. Programma stroomschema voor de lengtebepaling;
25
Zo ook het programma stroomschema om de data uit te lezen van de tabel en in Excel te plaatsen;
26
4.4
VBA routine
De VBA routine wordt opgedeeld uit twee stukken programmatuur. Het eerste deel zal geschreven worden om de lengte van de lijnstukken te bepalen en weer te geven in de tabel. Het tweede deel is geschreven om de data uit de tabel over te hevelen naar een Excel sheet, en de raming hiermee te kunnen verzorgen.
In het eerste deel worden de laagnamen onderscheiden, de lengte van rechte en gebogen lijnstukken in dezelfde constructiecode opgeteld. En deze worden dan gepositioneerd op de juiste plaats in de tabel.
De VBA routine om de lengtes kunnen bepalen en te plaatsen, ziet er dan als volgt uit: Sub Hoeveelheden_Constructiecodes_tabel_vullen()
Dim Lijn As AcadObject Dim METER805 As Integer Dim METER806 As Integer Dim METER807 As Integer Dim METER808 As Integer Dim METER810 As Integer Dim METER811 As Integer Dim METER812 As Integer Dim METER814 As Integer Dim METER815 As Integer Dim METER816 As Integer Dim METER817 As Integer Dim METER818 As Integer Dim METER819 As Integer Dim METER820 As Integer Dim METER821 As Integer Dim METER822 As Integer Dim METER823 As Integer Dim METER824 As Integer Dim METER825 As Integer Dim METER826 As Integer Dim METER827 As Integer
27
Dim METER827A As Integer Dim METER828 As Integer Dim METER828A As Integer Dim METER829 As Integer Dim METER830 As Integer Dim METER831 As Integer Dim METER832 As Integer Dim METER836 As Integer Dim METER837 As Integer Dim METER840 As Integer Dim METER841 As Integer Dim METER842 As Integer Dim METER843 As Integer Dim METER845 As Integer Dim METER846 As Integer Dim METER847 As Integer Dim METER850 As Integer Dim METER851 As Integer Dim METER852 As Integer
For Each Lijn In ThisDrawing.ModelSpace If Lijn.Layer = "R_BN_T_N_Constructiecode_805" Then If Lijn.ObjectName = "AcDbArc" Then METER805 = METER805 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER805 = METER805 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_806" Then If Lijn.ObjectName = "AcDbArc" Then METER806 = METER806 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER806 = METER806 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_807" Then If Lijn.ObjectName = "AcDbArc" Then METER807 = METER807 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER807 = METER807 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_808" Then If Lijn.ObjectName = "AcDbArc" Then METER808 = METER808 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER808 = METER808 + Lijn.Length End If
28
If Lijn.Layer = "R_BN_T_N_Constructiecode_810" Then If Lijn.ObjectName = "AcDbArc" Then METER810 = METER810 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER810 = METER810 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_811" Then If Lijn.ObjectName = "AcDbArc" Then METER811 = METER811 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER811 = METER811 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_812" Then If Lijn.ObjectName = "AcDbArc" Then METER812 = METER812 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER812 = METER812 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_814" Then If Lijn.ObjectName = "AcDbArc" Then METER814 = METER814 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER814 = METER814 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_815" Then If Lijn.ObjectName = "AcDbArc" Then METER815 = METER815 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER815 = METER815 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_816" Then If Lijn.ObjectName = "AcDbArc" Then METER816 = METER816 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER816 = METER816 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_817" Then If Lijn.ObjectName = "AcDbArc" Then METER817 = METER817 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER817 = METER817 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_818" Then If Lijn.ObjectName = "AcDbArc" Then METER818 = METER818 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER818 = METER818 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_819" Then If Lijn.ObjectName = "AcDbArc" Then METER819 = METER819 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER819 = METER819 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_820" Then If Lijn.ObjectName = "AcDbArc" Then METER820 = METER820 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER820 = METER820 + Lijn.Length End If
29
If Lijn.Layer = "R_BN_T_N_Constructiecode_821" Then If Lijn.ObjectName = "AcDbArc" Then METER821 = METER821 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER821 = METER821 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_822" Then If Lijn.ObjectName = "AcDbArc" Then METER822 = METER822 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER822 = METER822 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_823" Then If Lijn.ObjectName = "AcDbArc" Then METER823 = METER823 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER823 = METER823 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_824" Then If Lijn.ObjectName = "AcDbArc" Then METER824 = METER824 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER824 = METER824 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_825" Then If Lijn.ObjectName = "AcDbArc" Then METER825 = METER825 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER825 = METER825 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_826" Then If Lijn.ObjectName = "AcDbArc" Then METER826 = METER826 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER826 = METER826 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_827" Then If Lijn.ObjectName = "AcDbArc" Then METER827 = METER827 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER827 = METER827 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_827A" Then If Lijn.ObjectName = "AcDbArc" Then METER827A = METER827A + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER827A = METER827A + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_828" Then If Lijn.ObjectName = "AcDbArc" Then METER828 = METER828 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER828 = METER828 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_828A" Then If Lijn.ObjectName = "AcDbArc" Then METER828A = METER828A + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER828A = METER828A + Lijn.Length End If
30
If Lijn.Layer = "R_BN_T_N_Constructiecode_829" Then If Lijn.ObjectName = "AcDbArc" Then METER829 = METER829 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER829 = METER829 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_830" Then If Lijn.ObjectName = "AcDbArc" Then METER830 = METER830 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER830 = METER830 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_831" Then If Lijn.ObjectName = "AcDbArc" Then METER831 = METER831 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER831 = METER831 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_832" Then If Lijn.ObjectName = "AcDbArc" Then METER832 = METER832 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER832 = METER832 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_836" Then If Lijn.ObjectName = "AcDbArc" Then METER836 = METER836 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER836 = METER836 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_837" Then If Lijn.ObjectName = "AcDbArc" Then METER837 = METER837 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER837 = METER837 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_840" Then If Lijn.ObjectName = "AcDbArc" Then METER840 = METER840 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER840 = METER840 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_841" Then If Lijn.ObjectName = "AcDbArc" Then METER841 = METER841 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER841 = METER841 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_842" Then If Lijn.ObjectName = "AcDbArc" Then METER842 = METER842 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER842 = METER842 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_843" Then If Lijn.ObjectName = "AcDbArc" Then METER843 = METER843 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER843 = METER843 + Lijn.Length End If
31
If Lijn.Layer = "R_BN_T_N_Constructiecode_845" Then If Lijn.ObjectName = "AcDbArc" Then METER845 = METER845 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER845 = METER845 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_846" Then If Lijn.ObjectName = "AcDbArc" Then METER845 = METER845 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER845 = METER845 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_847" Then If Lijn.ObjectName = "AcDbArc" Then METER847 = METER847 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER847 = METER847 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_850" Then If Lijn.ObjectName = "AcDbArc" Then METER850 = METER850 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER850 = METER850 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_851" Then If Lijn.ObjectName = "AcDbArc" Then METER851 = METER851 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER851 = METER851 + Lijn.Length End If If Lijn.Layer = "R_BN_T_N_Constructiecode_852" Then If Lijn.ObjectName = "AcDbArc" Then METER852 = METER852 + Lijn.ArcLength If Lijn.ObjectName = "AcDbLine" Then METER852 = METER852 + Lijn.Length End If Next Lijn
For Each ObJJ In ThisDrawing.PaperSpace If ObJJ.ObjectName = "AcDbBlockReference" Then If UCase(ObJJ.Name) = "RET_HOEVEELHEDEN_CONSTRUCTIECODES_TABEL" Then StempeL = 1 Attributen = ObJJ.GetAttributes For I = LBound(Attributen) To UBound(Attributen) Set Attribuut = Attributen(I) If Attribuut.TagString = "METER805" Then Attribuut.TextString = METER805 If Attribuut.TagString = "METER806" Then Attribuut.TextString = METER806 If Attribuut.TagString = "METER807" Then Attribuut.TextString = METER807 If Attribuut.TagString = "METER808" Then Attribuut.TextString = METER808 If Attribuut.TagString = "METER810" Then Attribuut.TextString = METER810 If Attribuut.TagString = "METER811" Then Attribuut.TextString = METER811
32
If Attribuut.TagString = "METER812" Then Attribuut.TextString = METER812 If Attribuut.TagString = "METER814" Then Attribuut.TextString = METER814 If Attribuut.TagString = "METER815" Then Attribuut.TextString = METER815 If Attribuut.TagString = "METER816" Then Attribuut.TextString = METER816 If Attribuut.TagString = "METER817" Then Attribuut.TextString = METER817 If Attribuut.TagString = "METER818" Then Attribuut.TextString = METER818 If Attribuut.TagString = "METER819" Then Attribuut.TextString = METER819 If Attribuut.TagString = "METER820" Then Attribuut.TextString = METER820 If Attribuut.TagString = "METER821" Then Attribuut.TextString = METER821 If Attribuut.TagString = "METER822" Then Attribuut.TextString = METER822 If Attribuut.TagString = "METER823" Then Attribuut.TextString = METER823 If Attribuut.TagString = "METER824" Then Attribuut.TextString = METER824 If Attribuut.TagString = "METER825" Then Attribuut.TextString = METER825 If Attribuut.TagString = "METER826" Then Attribuut.TextString = METER826 If Attribuut.TagString = "METER827" Then Attribuut.TextString = METER827 If Attribuut.TagString = "METER827A" Then Attribuut.TextString = METER827A If Attribuut.TagString = "METER828" Then Attribuut.TextString = METER828 If Attribuut.TagString = "METER828A" Then Attribuut.TextString = METER828A If Attribuut.TagString = "METER829" Then Attribuut.TextString = METER829 If Attribuut.TagString = "METER830" Then Attribuut.TextString = METER830 If Attribuut.TagString = "METER831" Then Attribuut.TextString = METER831 If Attribuut.TagString = "METER832" Then Attribuut.TextString = METER832 If Attribuut.TagString = "METER836" Then Attribuut.TextString = METER836 If Attribuut.TagString = "METER837" Then Attribuut.TextString = METER837 If Attribuut.TagString = "METER840" Then Attribuut.TextString = METER840 If Attribuut.TagString = "METER841" Then Attribuut.TextString = METER841 If Attribuut.TagString = "METER842" Then Attribuut.TextString = METER842 If Attribuut.TagString = "METER843" Then Attribuut.TextString = METER843 If Attribuut.TagString = "METER845" Then Attribuut.TextString = METER845 If Attribuut.TagString = "METER846" Then Attribuut.TextString = METER846 If Attribuut.TagString = "METER847" Then Attribuut.TextString = METER847 If Attribuut.TagString = "METER850" Then Attribuut.TextString = METER850 If Attribuut.TagString = "METER851" Then Attribuut.TextString = METER851 If Attribuut.TagString = "METER852" Then Attribuut.TextString = METER852 Next I End If End If Next ObJJ On Error Resume Next End Sub
33
Na het opgeven van de variabele zien we dat een constante terugkeer van dezelfde regels plaatsvindt. In het eerste deel worden de lengte van de lagen bepaald, in het tweede deel worden ze in de tabel geplaatst.
Het modulaire waar ik eerder over sprak is nu zichtbaar geworden. Dit is bij allerlei lengte bepalingen toe te passen door simpelweg de benaming in de berekening en de plaatsing in de tabel te wijzigen.
4.5
Excel
In het tweede deel worden de gegevens overgehaald van de tabel, met de constructiecode hoeveelheden, naar Excel. En worden natuurlijk op de juiste positie in het Excel sheet geplaatst.
Ook deze VBA routine is volgens een systematiek opgebouwd, en te gebruiken met wat kleine aanpassingen om andere hoeveelheden uit te trekken en op locaties in een Excel sheet te positioneren.
De VBA routine voor data extractie is als volgt: Rem Dim Ex As Excel.Application Sub test() Set Ex = VBA.CreateObject("Excel.application") Ex.Visible = True Ex.ScreenUpdating = True Ex.DisplayAlerts = False Call Ex.Workbooks.Open("c:\DATA\test.xls") lees = Ex.ActiveWorkbook.ActiveSheet.Cells(1, 1) Dim f(0 To 1) As Integer Dim d(0 To 1) As Variant f(0) = 0 d(0) = "INSERT" f(1) = 2 d(1) = "RET_Hoeveelheden_Constructiecodes_tabel" Dim ss1 As AcadSelectionSet On Error Resume Next ThisDrawing.SelectionSets.Item("abs").Delete On Error GoTo 0 Set ss1 = ThisDrawing.SelectionSets.Add("abs") Call ss1.Select(acSelectionSetAll, , , f, d) Dim blokreferentie As AcadBlockReference Set blokreferentie = ss1.Item(0) Attributen = blokreferentie.GetAttributes Dim attribuut As AcadAttributeReference For i = 0 To 26 Set attribuut = Attributen(i) gegeven = attribuut.TextString Ex.ActiveWorkbook.ActiveSheet.Cells(35 + i, 5).Value = gegeven Next i
35
'MsgBox lees 'Ex.Quit 'Set Ex = Nothing End Sub Sub test1() End Sub
Hiermee hebben in een tweeledige VBA routine de lengte van de constructiecodes bepaald, weergegeven in een tabel, en gezorgd dat de overdracht naar de raming in Excel mogelijk is. In de VBA routine wordt opgegeven waar men de data terug ziet in de Excel sheet, ofwel de ramingstaat.
36
4.6
Toolpalette
Om de gebruiker van alle hulpmiddelen en VBA routines gebruik te laten maken is er een toolpalette aangemaakt. Hierin zijn alle snelkoppelingen verwerkt naar de blokken, VBA routines en hulp commando’s.
Een layout van de palette is te zien in bijlage 9. Er is meer in de palette aanwezig dan hier in dit verlag beschreven wordt. Met het modulaire idee is er al een extra VBA routine ontwikkeld om onderdelen van een kokersysteem te tellen, en weer te geven in een tabel. Hier gaan we nu niet verder op in, doch laat ik het in de bijlage zien omdat hiermee aangeduid wordt dat modulair zijn meerwaarde heeft.
Terugkomend op modulair wat enkele keren genoemd wordt in dit verslag wil ik vermelden dat het niet iets is wat ik nieuw aanbreng. Het is de mannier van programmeren die het mogelijk maakt om de onderdelen te ‘hergebruiken’ voor meerdere doeleinden.
In de bijgeleverde toolpalette is te zien hoe men met de buttons de acties kan activeren. De opbouw van boven naar beneden, in bijlage 9, is als volgt: -
Constructiecodes tellen, spreekt de betreffende VBA routine aan en vult de tabel.
-
Data extractie naar Excel, idem maar data overdracht.
-
Trekputten tellen, VBA routine om onderdelen van een kokersysteem te tellen en ook in een tabel te plaatsen.
-
Uitlezen tabblad, neemt de naam van de layout (paperspace) over en plaatst deze in het tekenhoofd.
-
Tabel plaatsen om de hoeveelheden constructiecodes weer te geven.
-
Tabel plaatsen om de hoeveelheden van het kokerysteem weer te geven.
-
Break at point commando, met de ‘*’ (asterisk) voor het commando.
-
Importeren van het Dynamische kader direct op het nulpunt. 37
-
Purge all, een purge commando waarbij met 1 druk op de knop alle wordt geschoond, zonder extra enters of opties te moeten selecteren.
In de toolpalette worden dus handige tools meegegeven, die regelmatig gebruikt worden. Deze technische informatie achter de knoppen is te bekijken in bijlagen 10 tot en met 16.
38
5.0 Conclusies en aanbeveling Het is eenvoudig te concluderen dat met omschreven VBA routines in combinatie met de hulptools het zeer snel en eenvoudig werken is. Bij aanpassing van de werkgrenzen van het project of bij verandering van constructiecodes, volgt met een druk op de knop een nieuwe telling. De tijdwinst is enorm en de nauwkeurigheid is ontelbare malen gestegen.
Bijvoorbeeld een groot tramproject waar ik nu aan werk, de Goudsesingel, waar we een kleine 2800 meter spoor zullen gaan vervangen. Gebruikelijk was om de afstanden te maatvoeren en hierna op te tellen met de calculator. Hierna volgt de handmatige invoer in de tabel. Nu haalt men de lijnlengtes over naar de juiste layer en gebruiken we het programma om te tellen en de waarde weer te geven in de tabel. Rekening houdend met een controle op het gedane werk, moet men in de eerste situatie al heel snel denken aan een uur werk, waarin met mijn eigen ervaring in de nieuwe situatie nog maar over hooguit 15 minuten spreekt. Controle in de nieuwe situatie is, door de gebruikte lagen weer te geven, en te kijken of alles juist is ingevuld, een actie van hooguit een paar minuten. Invullen in de tabel, of calculator gebeurt niet meer handmatig waardoor invoer fouten uitgesloten worden.
Door de VBA routines, hulpmiddelen en zeker ook het laagdrempelig gebruik door het aanbieden van compleet verzorgde toolpalette is het makkelijke te gebruiken. Hierdoor zal het ook gebuikt worden, in tegenstelling tot lastige onoverzichtelijke programmatuur of hulpmiddelen, waarbij gebruikers foeteren en zonder plezier met het gereedschap aan de slag moeten.
De conclusie en oplossing is het gebruik van VBA routines, natuurlijk in combinatie met de aangeboden hulpmiddelen.
39
Nawoord Voor de nabije toekomst staan er VBA routines aan te komen waarin meer lengtes en blokken geteld zullen worden. Het uittrekken van data is in een snelle ontwikkeling op de afdeling. Een voorbeeld wordt al gegeven met de telling van een kokersysteem met al zijn onderdelen.
We zullen sneller en nauwkeuriger kunnen werken met de uitbreiding van deze tools. Voor het ingenieursbureau van de RET is dit de toekomst, en de toekomst is nog maar net begonnen.
40
Literatuurlijst -
AutoCAD 2010 Computer ondersteunend ontwerpen Auteur: Ir. R. Boeklagen
-
WWW.Autodesk.Com Internetsite van autodesk
-
RET Handboek tekeningen Auteur: spoorwegtechniek
Bijlagen Bijlage 1,
Tabel hoeveelheden constructiecode
2
Bijlage 2,
Constructiecode tekening (code 827)
3
Bijlage 3,
Weergave op tekening
4
Bijlage 4,
Break in the CUI
5
Bijlage 5,
Breek oplossing uit de toolpalette
6
Bijlage 6,
Break Solution
7 41
Bijlage 7,
Standaard antwoord Autodesk
8
Bijlage 8,
Tabel voor weergave hoeveelheden constructiecodes
9
met laagindeling Bijlage 9,
De toolpalette
10
Bijlage 10 , Button constructiecodes tellen
11
Bijlage 11 , Button Data extractie naar Excel
12
Bijlage 12,
Button uitlezen tabblad
13
Bijlage 13,
Button uitlezen tabblad
14
Bijlage 14,
Button uitlezen tabblad
15
Bijlage 15,
VBA routine uitlezen tabblad
16
Bijlage 16,
VBA routine trekputten tellen tabblad
17
42
Bijlage 1.
Tabel hoeveelheden constructiecode.
43
Bijlage 2.
Constructiecode tekening (code 827).
44
Bijlage 3.
Weergave op tekening.
45
Bijlage 4.
Break in the CUI.
46
Bijlage 5.
Breek oplossing uit de toolpalette.
47
Bijlage 6.
Break Solution.
Autodesk
20 Oktober 2009
When using the break from point command repeatedly, it will continue as a normal break command. It breaks the line with a 2 point click instead of one. At work we use version AutoCAD 2007, at home I checked my student version of 2010 and it worked the same as 2007. Put an asterisk “*” at the beginning of the break command (CUI), makes it repeat itself and it continues as the break from point command even if you repeat it constantly (mouse click). *^C^C_break;\_f;\@; (original command ^C^C_break;\_f;\@;) The commands will stay different from this time on. This can be used in future releases of the AutoCAD software to give the customers a different break command. With kind regards Patrick Verkade
48
Bijlage 7.
Standaard antwoord Autodesk
Receipt for: Feedback Form: Product Experience Issues InboxX Reply |
[email protected] to me show details 11:58 AM (3 minutes ago)
Thank you for your feedback. Due to the amount of feedback we receive, we are unable to directly respond to every comment and question. Be assured however that we take what our customers have to say very seriously. If you are in need of technical support, please refer to the resources below. • Subscription customers can log a new support request at the Subscription Center: www.autodesk.com/subscriptionlogin • If you are not currently a Subscription customer, the following link details the many other technical assistance resources available: www.autodesk.com/technicalassistance Please do not reply to this message. This message was sent from an unmonitored e-mail address.
49
Bijlage 8.
Tabel voor weergave hoeveelheden constructiecodes.
50
Bijlage 9.
De toolpalette.
51
Bijlage 10.
Button constructiecodes tellen.
52
Bijlage 11.
Button Data extractie naar Excel.
53
Bijlage 12.
Button uitlezen tabblad.
54
Bijlage 13.
Button uitlezen tabblad.
55
Bijlage 14.
Button kader importeren.
56
Bijlage 15.
VBA routine uitlezen tabblad. Sub Uitlezen_Tabblad() Dim TITELREGEL_1 As String TITELREGEL_1 = ThisDrawing.PaperSpace.Layout.Name For Each ObJJ In ThisDrawing.PaperSpace If ObJJ.ObjectName = "AcDbBlockReference" Then If UCase(ObJJ.Name) = "RET_KADER" Or Left(UCase(ObJJ.Name), 2) = "*U" Then StempeL = 1 Attributen = ObJJ.GetAttributes For i = LBound(Attributen) To UBound(Attributen) Set Attribuut = Attributen(i) If Attribuut.TagString = "TITELREGEL_1" Then Attribuut.TextString = TITELREGEL_1 Next I End If End If Next ObJJ On Error Resume Next End Sub
57
Bijlage 16.
VBA routine trekputten tellen tabblad. Sub Trekputten_tabel_vullen() Dim putje As AcadObject Dim ObJJ As AcadObject Dim attribuut As AcadAttributeReference Dim Attributen As Variant StempeL = 0 maat = ThisDrawing.GetVariable("INSUNITS") 'Als InsUnits geen 5 (cm), 6 (m), 7 (km) is dan ... Select Case maat Case 4 'mm maat = 0.001 Case 5 'cm maat = 0.01 Case 6 'm maat = 1 Case 7 'km maat = 1000 End Select Dim BA0 As Integer: BA0 = 0 Dim BOCHT30 As Integer: BOCHT30 = 0 Dim BOCHT45 As Integer: BOCHT30 = 0 Dim EINDKAP As Integer: EINDKAP = 0 Dim HA1340 As Integer: HA1340 = 0 Dim HA2340 As Integer: HA2340 = 0 Dim HA2341 As Integer: HA2340 = 0 Dim MINPUT As Integer: MINPUT = 0 Dim LASPUT As Integer: LASPUT = 0 Dim OPZETSTUK As Integer: OPZETSTUK = 0 Dim PUTDEKSEL As Integer: PUTDEKSEL = 0 Dim SOKKEL As Integer: SOKKEL = 0 Dim Lijntje As AcadObject Dim KokerStar As Variant Dim KokerFlex As Variant flex1 = 0: flex2 = 0 Star1 = 0: Star2 = 0 For Each Lijntje In ThisDrawing.ModelSpace If Lijntje.ObjectName = "AcDbArc" Or Lijntje.ObjectName = "AcDbLine" Then If Lijntje.ObjectName = "AcDbArc" Then lengte = Lijntje.ArcLength If Lijntje.ObjectName = "AcDbLine" Then lengte = Lijntje.Length If UCase(Lijntje.Layer) = "R_BN_T_N_KOKERSYSTEEM_SIGNAAL_FLEX" Then KokerFlex = KokerFlex + lengte: flex1 = flex1 + 1 If UCase(Lijntje.Layer) = "R_BN_T_N_KOKERSYSTEEM_LAAGSPANNING_FLEX" Then KokerFlex = KokerFlex + lengte: flex2 = flex2 + 1 If UCase(Lijntje.Layer) = "R_BN_T_N_KOKERSYSTEEM_SIGNAAL" Then KokerStar = KokerStar + lengte: Star1 = Star1 + 1 If UCase(Lijntje.Layer) = "R_BN_T_N_KOKERSYSTEEM_LAAGSPANNING" Then KokerStar = KokerStar + lengte: Star2 = Star2 + 1 End If Next Lijntje
58
For Each putje In ThisDrawing.ModelSpace If putje.ObjectName = "AcDbBlockReference" Then If UCase(putje.Name) = "BA.0" Then BA0 = BA0 + 1 If UCase(putje.Name) = "BOCHT_30_GRADEN" Then BOCHT30 = BOCHT30 + 1 If UCase(putje.Name) = "BOCHT_45_GRADEN" Then BOCHT45 = BOCHT45 + 1 If UCase(putje.Name) = "EINDKAP" Then EINDKAP = EINDKAP + 1 If UCase(putje.Name) = "HA.1.340" Then HA1340 = HA1340 + 1 If UCase(putje.Name) = "HA.2.340" Then HA2340 = HA2340 + 1 If UCase(putje.Name) = "HA.2.341_DEELBARE_PUT" Then HA2341 = HA2341 + 1 If UCase(putje.Name) = "MINPUT" Then MINPUT = MINPUT + 1 If UCase(putje.Name) = "LASPUT" Then LASPUT = LASPUT + 1 If UCase(putje.Name) = "OPZETSTUK" Then OPZETSTUK = OPZETSTUK + 1 If UCase(putje.Name) = "PUTDEKSEL_TBV_ASFALT" Then PUTDEKSEL = PUTDEKSEL +1 If UCase(putje.Name) = "SOKKEL" Then SOKKEL = SOKKEL + 1 End If Next putje For Each ObJJ In ThisDrawing.PaperSpace If ObJJ.ObjectName = "AcDbBlockReference" Then If UCase(ObJJ.Name) = "RET_HOEVEELHEDEN_KOKERSYSTEEM_TABLE" Then StempeL = 1 Attributen = ObJJ.GetAttributes For i = LBound(Attributen) To UBound(Attributen) Set attribuut = Attributen(i) If attribuut.TagString = "BA0" Then attribuut.TextString = BA0 If attribuut.TagString = "BOCHT30" Then attribuut.TextString = BOCHT30 If attribuut.TagString = "BOCHT45" Then attribuut.TextString = BOCHT45 If attribuut.TagString = "EINDKAP" Then attribuut.TextString = EINDKAP If attribuut.TagString = "HA1340" Then attribuut.TextString = HA1340 If attribuut.TagString = "HA2340" Then attribuut.TextString = HA2340 If attribuut.TagString = "HA2341" Then attribuut.TextString = HA2341 If attribuut.TagString = "MINPUT" Then attribuut.TextString = MINPUT If attribuut.TagString = "LASPUT" Then attribuut.TextString = LASPUT If attribuut.TagString = "OPZETSTUK" Then attribuut.TextString = OPZETSTUK If attribuut.TagString = "PUTDEKSEL" Then attribuut.TextString = PUTDEKSEL If attribuut.TagString = "SOKKEL" Then attribuut.TextString = SOKKEL If attribuut.TagString = "KOKER1" Then attribuut.TextString = KokerStar * maat: attribuut.TextString = Round(attribuut.TextString, 1) If attribuut.TagString = "KOKER2" Then attribuut.TextString = KokerFlex * maat: attribuut.TextString = Round(attribuut.TextString, 1) 'Oplossing om af te ronden op meters: 'star = KokerStar * maat 'If Round(star, 0) + 0.49 > Round(star, 0) Then star = KokerStar(star, 0) + 0.49 Else star = KokerStar(star, 0) Next i End If End If Next ObJJ If StempeL <> 1 Then ThisDrawing.Utility.Prompt vbCrLf & "Geen Legenda Trekputten gevonden. " & vbCrLf ThisDrawing.Utility.Prompt vbCrLf & vbCrLf & " " & flex1 & " lijnen op laag R_BN_T_N_Kokersysteem_signaal_flex. " & vbCrLf ThisDrawing.Utility.Prompt " " & flex2 & " lijnen op laag R_BN_T_N_Kokersysteem_laagspanning_flex. " & vbCrLf ThisDrawing.Utility.Prompt " " & Star1 & " lijnen op laag R_BN_T_N_Kokersysteem_signaal. " & vbCrLf
59
ThisDrawing.Utility.Prompt " " & Star2 & " lijnen op laag R_BN_T_N_Kokersysteem_laagspanning. " & vbCrLf & vbCrLf ThisDrawing.Utility.Prompt "Programma -Trekputten_tabel_vullen- gereed. " & vbCrLf End Sub Sub Lijnen_optellen() Dim Lijntje As AcadObject Dim KokerStar As Integer Dim KokerFlex As Integer For Each Lijntje In ThisDrawing.ModelSpace If Lijntje.Layer = "R_BN_T_N_Kokersysteem_signaal_flex." Or _ Lijntje.Layer = "R_BN_T_N_Kokersysteem_laagspanning_flex." Then If Lijntje.ObjectName = "AcDbArc" Then KokerFlex = KokerFlex + Lijntje.ArcLength If Lijntje.ObjectName = "AcDbLine" Then KokerFlex = KokerFlex + Lijntje.Length End If If Lijntje.Layer = "R_BN_T_N_Kokersysteem_signaal" Or _ Lijntje.Layer = "R_BN_T_N_Kokersysteem_laagspanning" Then If Lijntje.ObjectName = "AcDbArc" Then KokerStar = KokerStar + Lijntje.ArcLength If Lijntje.ObjectName = "AcDbLine" Then KokerStar = KokerStar + Lijntje.Length End If Next Lijntje MsgBox KokerStar & " KokerStar" MsgBox KokerFlex & " KokerFlex" End Sub
60