Voorwoord Toen ik een aantal jaren geleden bij Reynaers B.V. kwam werken bestond het maken van bouwkundige tekeningen voor kozijnenleveranciers voornamelijk uit Kopiëren, Knippen en Plakken. Ik kopiëerde tekeningen uit onze catalogus op doorzichtige sheets, knipte deze uit en plakte deze op de juiste manier met een Pritt-stift. De tekeningen die daaruit volgden konden met pen en potlood nog wat worden bijgewerkt en doorgaan voor details op maat. Tekeningen werden opgeslagen in een dikke map en als een collega een tekening nodig had, dan werd de map erop nageslagen. Dit resulteerde vaak in een driftig geblader tot de juiste tekening gevonden was en, oh wee, wanneer een tekening moest worden aangepast. Het behoeft niet veel uitleg dat dit niet bepaald een ideale manier van werken was. Na een tijdje gestoeid te hebben met de wonderen en de frustraties van het analoge opbergsysteem, was het idee gerezen om eens te kijken naar de mogelijkheden van een systeem waarbij gegevens toch wat gemakkelijker konden worden opgeborgen en weer teruggevonden. De eerste keuze viel op een lijstje in Excel waar alle Reynaers artikelen konden worden ingevoerd en een omschrijving daarbij. Het was driftig zoeken naar informatie die langs digitale weg kon worden aangevoerd vanuit het hoofdkantoor, maar al snel bleek dat maar weinig gegevens digitaal werden opgeslagen. Aan de slag dus. Een nieuwe aanpak werd opgestart. Eerst werd er gekeken naar de aanwezige gegevens en welke gegevens relevant waren voor ons en onze klanten. Dit bleek al gauw een enorm puzzelwerk van tabellen, koppelingen en lange lijsten met gegevens op te leveren, veel te groot en complex voor Excel. Er werd gezocht naar een systeem wat deze gegevens sneller en efficiënter kon beheren en het werd een Access database. Zo, nu kon het echte werk beginnen. In de paar dagen tussen Kerst en Nieuw die ik vrijgepland had werd een intranet van de grond getrokken wat gebruik maakte van de nieuwe datastructuur en voilà, de basis was daar. Nog geen beheersysteem in AutoCAD, let wel, en een hoop geharrewar met data en veel typwerk, maar een begin was gemaakt. Nu we een paar jaar verder zijn heeft alles wat definitievere vormen aangenomen. De databasestructuur heeft zich inmiddels bewezen en het werd hoog tijd dat er wat slimmer gegevens konden worden ingevoerd. Na wat gezoek was het al snel duidelijk dat de invoer van tekeningen maar op één manier slim kon worden aangepakt: vanuit AutoCAD. Een aantal eenvoudige oplossingen werd afgewogen, maar al snel bleek dat er met standaard marktoplossingen niets te beginnen was. Er moesten gewoonweg te veel concessies worden gedaan ten aanzien van de gegevens en daar kon ik niet mee aan de slag. De eerste opzet werd gemaakt voor een paar routines in AutoCAD die met de database communiceerden en langzaamaan vormde het project zich. Ik keek toen terug op waar ik begonnen was en concludeerde dat het zaakje nu maar eens netjes moest worden aangepakt. Een cursus kon worden aangevraagd waarin opleiding werd gegeven in het programmeren en beheren van AutoCAD. Een afstudeerproject werd gevraagd en de keuze viel natuurlijk op datgeen waarvoor ik al een tijdje aan het strijden was. Eindelijk is het zover. Het project is klaar, maar de automatisering verre van voltooid. Plannen genoeg, maar tijd is een groter probleem. Het leuke van alles is dat ik eigenlijk nog op dezelfde manier werk als helemaal in het begin. Slechts een paar wijzigingen zijn aangebracht in de werkwijze. Documentatie en kopiëerapparaat zijn vervangen door een aantal plaatjes en tekstvelden. Knippen en plakken doen we met een knop op het scherm in plaats van schaar en lijm. Alleen het denkwerk doen we nog als vanouds...
Vincent Maas
1
Inhoudsopgave Voorwoord.................................................................................................................................. 1 Inhoudsopgave .......................................................................................................................... 2 Inleiding ...................................................................................................................................... 4 1
Organisatie & huidige werkwijze........................................................................................ 5 1.1 Organisatie Reynaers algemeen ................................................................................... 5 1.2 Organisatie Reynaers B.V. ............................................................................................ 6 1.3 Terminologie.................................................................................................................. 7 1.3.1 Artikel ........................................................................................................................ 7 1.3.1.1 Profiel ................................................................................................................. 7 1.3.1.2 Accessoires ........................................................................................................ 7 1.3.2 Serie.......................................................................................................................... 7 1.4 Tekeningtypen............................................................................................................... 7 1.4.1 Profieltekeningen....................................................................................................... 8 1.4.2 Accessoirestekeningen ............................................................................................. 9 1.4.3 Samengestelde tekeningen ....................................................................................... 9 1.5 Huidige werkwijze........................................................................................................ 10 1.5.1 Situatie artikeltekeningen ........................................................................................ 11 1.5.1.1 Benaming van profieltekeningen ....................................................................... 12 1.5.1.2 Benaming van accessoirestekeningen .............................................................. 12 1.5.2 Situatie samengestelde tekeningen......................................................................... 13 1.5.2.1 Nummering van samengestelde tekeningen ..................................................... 13
2
Probleemstelling ............................................................................................................... 14 2.1 Knelpunten .................................................................................................................. 14 2.2 Wensen ....................................................................................................................... 15 2.3 Zoeken naar een oplossing ......................................................................................... 15 2.4 Conclusie .................................................................................................................... 15
3
Evaluatie van mogelijke oplossingen .............................................................................. 16 3.1 Optie 1: Kant-en-klare software aankopen................................................................... 16 3.2 Optie 2: Software laten ontwikkelen............................................................................. 16 3.3 Optie 3: Eigen software ontwikkelen ............................................................................ 16 3.4 Conclusie .................................................................................................................... 17
4
Vooronderzoek.................................................................................................................. 18 4.1 Uitgangspunten ........................................................................................................... 18 4.1.1 AutoCAD moet normaal blijven functioneren ........................................................... 18 4.1.2 Gebruiksvriendelijke interface ................................................................................. 18 4.1.3 Modulair opzetten.................................................................................................... 18 4.1.4 Zo min mogelijk handelingen verrichten .................................................................. 18 4.1.5 Bestaande structuur blijft gehandhaafd ................................................................... 18 4.2 Opzet database ........................................................................................................... 19 4.2.1 Tabel "Artikel".......................................................................................................... 19 4.2.2 Tabel "Artikel_Tekening" ......................................................................................... 19 4.2.3 Tabel "Tekening" ..................................................................................................... 19 4.2.4 Tabel "ProfTek" ....................................................................................................... 19 4.3 Theoretische opzet programma ................................................................................... 19 4.3.1 Database................................................................................................................. 20 4.3.1.1 Databasekoppeling ........................................................................................... 20 4.3.2 Interface .................................................................................................................. 20 4.3.2.1 Zoekroutine....................................................................................................... 20 4.3.2.2 Schrijfroutine..................................................................................................... 20
2
5
Werking van het programma............................................................................................ 21 5.1 Zoekroutine: formulier "fmFind" ................................................................................... 21 5.1.1 Componenten op formulier "fmFind"........................................................................ 22 5.1.2 Hoe werkt de zoekroutine?...................................................................................... 24 5.1.3 Wat levert het op? ................................................................................................... 24 5.2 Schrijfroutine: formulier "fmWrite" ................................................................................ 25 5.2.2 Hoe werkt de schrijfroutine? .................................................................................... 26 5.2.3 Wat levert het op? ................................................................................................... 27 5.3 Systeemeisen.............................................................................................................. 28 5.3.1 Lijst van Componenten............................................................................................ 28
6
Bijlagen.............................................................................................................................. 29 6.1 Programmacode constantendefinities.......................................................................... 29 6.2 Programmacode functie rcArticleNumber .................................................................... 31 6.3 Programmacode functie rcDrawingPath ...................................................................... 34 6.4 Programmacode routine rcFindArticleDrawings........................................................... 41 6.5 Programmacode routine rcFillSectionForm.................................................................. 45 6.6 Programmacode routine rcSaveSectionDrawing.......................................................... 48
Lijst van afbeeldingen ............................................................................................................. 51 Lijst van tabellen...................................................................................................................... 51
3
Inleiding Dit rapport behandelt in detail het ontwikkeltraject van een applicatie welke ten doel heeft het documenteren en opzoeken van tekeningen die gemaakt worden door de technische dienst van Reynaers B.V.. Dit rapport bestaat uit zes elementen. Hoofdstuk 1: Organisatie en huidige werkwijze Dit hoofdstuk beschrijft de organisatie van Reynaers en de terminologie die intern wordt gehanteerd. Er zal worden ingegaan op de indeling van brontekeningen in de CAD-bibliotheek en de manier waarop nu te werk wordt gegaan bij het maken van nieuwe tekeningen. Hoofdstuk 2: Probleemstelling Dit hoofdstuk zal ingaan op de problemen welke bij de huidige werkwijze worden geconstateerd. Er wordt beschreven wat de problemen zijn, wat eventuele wensen zijn ter verbetering en uitbreiding van de huidige werkwijze en wat geconcludeerd mag worden uit deze probleemstelling. Hoofdstuk 3: Evaluatie van mogelijke oplossingen In dit hoofdstuk zal worden bekeken welke mogelijkheden er zijn die kunnen leiden tot een oplossing van de in hoofdstuk 2 geconstateerde problematieken. Er zal worden geconcludeerd welke oplossing gekozen is en waarom. Hoofdstuk 4: Vooronderzoek van gekozen oplossing In dit hoofdstuk wordt uitgewerkt hoe de gekozen oplossing zal worden uitgewerkt. Er worden uitgangspunten genoemd en een basisstructuur wordt opgezet die gebruikt wordt om de definitieve routines te maken. Hoofdstuk 5: Uitwerking van de gekozen oplossing Dit hoofdstuk behandelt het programma waartoe het project heeft geleid en beschrijft de functionaliteit en werking van het geheel. Bijlagen In de bijlagen is een aantal programmaonderdelen volledig als programmacode opgenomen. Slechts een paar hoofdonderdelen is hierin terug te vinden. De volledige programmacode beslaat 82 pagina's en is op aanvraag beschikbaar als Acrobat Reader bestand (PDF).
4
1
Organisatie & huidige werkwijze Reynaers is een leverancier van aluminiumproducten ten behoeve van de constructie van ramen, deuren, schuifpuien, serredaken, vliesgevels, enz. Als groothandel in aluminium levert Reynaers haar producten wereldwijd aan verwerkers van aluminium: serrebouwers, raam- en deurfabrikanten, gevelbouwers, enz. Hierbij is in het bouwproces een groot aantal partijen betrokken, zoals architecten, tekenbureaus, aannemers, enz. Om het mogelijk te maken haar product reeds in de planningsfase van een bouwproject voor te schrijven is Reynaers betrokken bij het gehele bouwproces. Elke partij in elke bouwfase heeft een eigen eisenpakket als het gaat om benodigde informatie. Zo heeft bijvoorbeeld een architect in veel gevallen genoeg aan een principeschets van een product, maar vraagt een aluminiumconstructeur gedetailleerde tekeningen betreffende hoe een product kan worden gezaagd, geboord en in een gebouw bevestigd. Om elke partij van de juiste informatie te voorzien produceert Reynaers, naast aluminium, tekeningen.
1.1 Organisatie Reynaers algemeen Reynaers Aluminium N.V. is een internationaal bedrijf gevestigd in Duffel, België. Het bedrijf heeft vestigingen in verschillende landen, hoofdzakelijk in Europa maar ook in het Midden Oosten, Azië, Afrika, en Zuid-Amerika.
Afbeelding 1: Reynaers in europa
5
Voor de internationale verkoop van haar producten bouwt Reynaers Aluminium N.V. op haar filialen; dochterondernemingen met een eigen verkoopafdeling, technische dienst en vertegenwoordigers. Elk filiaal zorgt voor het rechtstreekse contact met de afnemer van het Reynaers product en de technische en praktische ondersteuning hiervan. Op deze manier wordt direct praktijkgerichte informatie, aangepast aan de eisen en wensen die op de nationale markten gelden, aan de klant verstrekt.
1.2 Organisatie Reynaers B.V. Reynaers B.V. is een dochteronderneming van Reynaers Aluminium N.V. en het filiaal voor de verkoop van Reynaers producten in Nederland. Reynaers B.V. heeft een eigen verkoopafdeling, technische dienst en adviesafdeling voor architecten om haar klanten altijd van relevante en marktgerichte informatie te kunnen voorzien. De technische dienst van Reynaers B.V. zorgt voor tekeningen, projectgericht of algemeen, waarmee haar klanten het Reynaers product kunnen voorschrijven of verwerken. Ik ben zelf werkzaam bij de technische dienst van Reynaers B.V., als hoofd tekenkamer en constructeur. De werkzaamheden houden in: het maken en verspreiden van informatie betreffende de verwerking van het Reynaers product in digitale en gedrukte vorm. De tekenafdeling bestaat momenteel uit twee personen die zorg moeten dragen voor tekeningen voor aluminiumverwerkers, aannemers, architecten, enz. Een deel van mijn werkzaamheden bestaat tevens uit het beheren van digitale gegevens welke binnen de organisatie worden gegenereerd, alsmede de ontwikkeling van digitale beheersystemen voor deze informatie.
Directie Kwaliteit Financiën
Technische Dienst
Verkoop Intern
Secretariaat
Verkoop Extern
Advies Architecten
Transport Afbeelding 2: Organisatiestructuur Reynaers B.V.
6
1.3 Terminologie Alvorens een overzicht te kunnen maken van de huidige werkwijze volgt hier een korte opsomming van de bij Reynaers gebezigde termen welke betrekking hebben op het Reynaers product.
1.3.1 Artikel Een artikel is essentiëel het kleinste product wat door Reynaers wordt geleverd. Elk artikel heeft een uniek nummer wat uit zeven letters en/of cijfers bestaat. Artikelen bestaan ofwel uit één deel, ofwel uit meerdere subartikelen welke in principe niet afzonderlijk worden verkocht. Artikelen worden middels een database beheerd welke in een eerdere fase van dit automatiseringstraject is opgezet. Artikelen kunnen in principe worden verdeeld in profielen en accessoires.
1.3.1.1 Profiel Een profiel is een artikel wat over de gehele lengte dezelfde doorsnede heeft. Voor profielen is dus deze doorsnede kenmerkend voor de functionaliteit van het artikel. Profieltekeningen zijn altijd tweedimensionaal met een variabele lengte.
1.3.1.2 Accessoires Accessoires zijn alle artikelen waarvoor geldt dat deze niet over de gehele lengte dezelfde doorsnede hebben. Voor vastleggen van toebehoren zal dus altijd een driedimensionale tekening noodzakelijk zijn met een aantal aanzichten.
1.3.2 Serie Een Reynaers serie is een verzameling van artikelen welke volgens een bepaald thema zijn ontwikkeld. Series kunnen worden onderverdeeld in Ramen en Deuren, Schuifpuien, Serres, Vliesgevels en Hulpsystemen. Voor de verduidelijking van een serie is een aantal tekeningen nodig die bijna altijd betrekking hebben op meer dan één artikel. Per serie wordt een documentatiemap gemaakt waarin middels tekeningen duidelijk wordt gemaakt hoe een serie kan worden toegepast.
1.4 Tekeningtypen Bij Reynaers wordt onderscheid gemaakt tussen tekeningen die betrekking hebben op één artikel en tekeningen die betrekking hebben op de toepassing van één serie of de koppeling van meerdere series. Artikeltekeningen liggen ten grondslag aan alle samengestelde tekeningen voor verduidelijking van een serie.
7
1.4.1 Profieltekeningen Voor elk profiel wordt ten minste één, maar meestal meer dan één tekening gemaakt. Een profieltekening is altijd een tweedimensionale doorsnede bestaande uit een aantal gesloten contouren met arceringen van de gebruikte materialen. Bemating en iconen geven verdere informatie betreffende het profiel. In Afbeelding 3 is een voorbeeld van een geïsoleerd profiel weergegeven.
Afbeelding 3: Profieltekening
8
1.4.2 Accessoirestekeningen Voor elk accessoire dienen ten minste vier tekeningen te worden gemaakt. Om een driedimensionaal artikel duidelijk te kunnen weergeven is in elk geval een 3D model nodig en minstens drie aanzichten. In de praktijk blijken vaak meerdere tekeningen nodig te zijn om alle documentatiebladen te kunnen maken welke betrekking hebben op het artikel. Een voorbeeld van een tekening van een hoekverbinding voor aluminium profielen is gegeven in Afbeelding 4.
Afbeelding 4: Accessoirestekeningen
1.4.3 Samengestelde tekeningen Een samengestelde tekening is een tekening waarop twee of meerdere artikeltekeningen worden geplaatst, meestal één of meerdere profielen en een aantal accessoires. Samengestelde tekeningen worden over het algemeen per serie ingedeeld en vormen het hoofdbestanddeel van de werkzaamheden bij de tekenafdeling van Reynaers B.V. aangezien zij worden gemaakt om de toepassing van artikelen te verduidelijken. Afbeelding 5 toont een horizontale doorsnede van een naar binnen draaiend raam. In de tekening is het principe geschetst hoe het raam in een stelkozijn wordt geplaatst, hoe het glas wordt ingeklemd, wat de hoofdmaten zijn, enz.
Afbeelding 5: Samengestelde tekening
9
Samengestelde tekeningen worden in vele vormen geproduceerd, afhankelijk van het doel van de tekening. Elke klant heeft hiervoor haar eigen wensen en eisen. Voor de architect is het belangrijk om te weten hoe een oplossing eruit ziet die hij of zij in een gebouw wil toepassen. Deze informatievrager wil daarom weten wat de afmetingen zijn van een detailoplossing en hoe één en ander in zijn of haar project kan worden geplaatst. Voor de ramenfabrikant is het belangrijk te weten hoe water wordt afgevoerd binnen een raam, waar een kozijn kan worden vastgeschroefd in een muur, hoe ver een scharnier uitsteekt, hoe de gaten worden geboord voor de montage van een deurkruk, enz. De aard van deze informatie is veel gevallen veel gedetailleerder en de aandacht ligt op andere zaken dan bij de architect.
1.5 Huidige werkwijze Op dit moment wordt bij Reynaers B.V. gewerkt met een standaardinstallatie van AutoCAD 2002. Daarnaast is er een centrale CAD-bibliotheek met enige duizenden tekeningen in diverse formaten. Wanneer een nieuwe tekening wordt gemaakt is het zaaks de benodigde artikeltekeningen op te vragen vanaf de juiste plaats in de CAD-bibliotheek. De CAD bibliotheek bestaat uit een aantal directories op een server binnen het lokale netwerk van Reynaers B.V. Alle tekeningen welke met AutoCAD worden gemaakt en gegenereerd worden hierin opgeslagen. De indeling van de CAD-bibliotheek is schriftelijk vastgelegd in een tekenhandleiding zodat tekeningen binnen een redelijke tijd kunnen worden opgezocht. De volledige structuur van de CAD-bibliotheek beslaat diverse pagina's. We zullen daarom ons beperken tot de indeling van de hoofddirectories welke betrekking hebben op dit project. Tabel 1-1: Directorystructuur CAD-bibliotheek
CAD Algemene CAD-directory AutoCAD Support Ondersteuning AutoCAD Support Centrale supportdirectory voor alle tekenstations gelijk DWG Symbolenbibliotheek Access Accessoirestekeningen op artikelnummer algModel Modeltekeningen op modelnummer arcBasis Basisdetails voor architecten op tekeningnummer arcBouwkundig Bouwkundige details voor architecten op tekeningnummer docAlgemeen Documentatietekeningen op artikelnummer docVerduidelijking Documentatietekeningen ter verduidelijking van een artikel Profiel Profieltekeningen op artikelnummer DXF DXF-files voor klanten in AutoCAD R12 formaat Access Accessoirestekeningen op artikelnummer arcBasis Basisdetails voor architecten op tekeningnummer Profiel Profieltekeningen op artikelnummer DWF DWF-files voor website algModel Modeltekeningen op modelnummer arcBasis Basisdetails voor architecten op tekeningnummer arcBouwkundig Bouwkundige details voor architecten op tekeningnummer docAlgemeen Documentatietekeningen op artikelnummer docVerduidelijking Documentatietekeningen ter verduidelijking van een artikel JPG JPG-files voor website algModel Modeltekeningen op modelnummer arcBasis Basisdetails voor architecten op tekeningnummer arcBouwkundig Bouwkundige details voor architecten op tekeningnummer docAlgemeen Documentatietekeningen op artikelnummer docVerduidelijking Documentatietekeningen ter verduidelijking van een artikel
10
PNG algModel arcBasis arcBouwkundig docAlgemeen docVerduidelijking
PNG-files voor website Modeltekeningen op modelnummer Basisdetails voor architecten op tekeningnummer Bouwkundige details voor architecten op tekeningnummer Documentatietekeningen op artikelnummer Documentatietekeningen ter verduidelijking van een artikel
De hierboven beschreven structuur is een gegeven en zal in het vervolgtraject worden gebruikt als uitgangspunt. Enige aanpassingen aan de structuur zijn mogelijk, maar zullen niet binnen dit project worden behandeld. Deze zouden in een later stadium aan bod kunnen komen.
1.5.1 Situatie artikeltekeningen Een artikeltekening wordt doorgaans opgezocht in de gedrukte Reynaers documentatie. Per serie is een map beschikbaar waarin alle artikelen welke voor die serie nodig zijn staan vermeld. Als het benodigde artikel wordt gevonden, kan dit onder het artikelnummer worden opgevraagd in AutoCAD. Hiervoor kan het artikelnummer worden ingevoerd in de "Find" functie van het AutoCAD "Open" commando. Het is echter zo dat tekeningen in deze zoekroutine niet kunnen worden getoond en het duurt enige tijd voordat alle tekeningen gevonden zijn. In een directorystructuur zoals deze bij Reynaers B.V. aanwezig is, betekent dat ongeveer tien seconden tot één minuut, afhankelijk van het gezochte artikelnummer. Omdat artikeltekeningen van profielen in de directory "Profiel" en van accessoires in de directory "Access" staan, is het gemakkelijker om naar de betreffende directory te gaan en het artikelnummer in te typen. Nu is het echter zo dat voor vele artikelen meer dan één tekening beschikbaar is. Deze zijn allen gerangschikt onder het artikelnummer, met een toevoeging in de vorm van een letter- en/of cijfercombinatie. Artikeltekeningen worden bij Reynaers B.V. in de regel gebruikt voor het maken van samengestelde tekeningen. Het beheer van de artikeltekeningen wordt gedaan door Reynaers Aluminium N.V., van waaruit de tekeningen van elk artikel op aanvraag kunnen worden verstrekt. De exacte benaming van artikeltekeningen ligt vast in een document genaamd "Handboek Tekenkamer". De afspraken hiervoor zijn gemaakt in overleg met de technische dienst van Reynaers Aluminium N.V., zodat de bibliotheek zo gemakkelijk mogelijk kan worden geactualiseerd.
11
1.5.1.1 Benaming van profieltekeningen De benaming van profieltekeningen is bijzonder eenvoudig; deze bestaat uit slechts het zevencijferige artikelnummer, eventueel met een toevoeging. Dit wordt als volgt toegepast: Artikelen in normale doorsnede: Meerdere normale doorsnedes:
Artikelen in vervormde doorsnede: Meerdere vervormde doorsnedes:
Tekening opgebouwd uit regions Tekening voor publicatie
#######.dwg #######a.dwg #######b.dwg enz. #######v.dwg #######v2.dwg #######v3.dwg #######v4.dwg enz. #######p.dwg #######z.dwg
(alléén als #######a.dwg bestaat)
(alléén als #######v.dwg bestaat) (alléén als #######v2.dwg bestaat) (alléén als #######v3.dwg bestaat) (voor 3D-modeling) (gemaatvoerde profieltekening)
1.5.1.2 Benaming van accessoirestekeningen De benaming van de accessoires is afhankelijk van welk aanzicht wordt gekozen. Als basis hiervoor wordt uitgegaan van het artikelnummer, met daaraan vast een codering die duidelijk maakt om wat voor type tekening het gaat: Artikelen in 2-D zijaanzicht: #######.dwg Artikelen in alternatieve 2-D aanzichten: #######a.dwg #######b.dwg enz. Artikelen in primair 3-D aanzicht: #######3.dwg Artikelen in secundair 3-D aanzicht: #######3a.dwg #######3b.dwg enz. Driedimensionale modeltekening Tekening voor publicatie
#######-3dm.dwg #######z.dwg
(alléén als #######.dwg bestaat) (alléén als #######a.dwg bestaat)
(alléén als #######3.dwg bestaat) (alléén als #######3a.dwg bestaat)
(meest kenmerkende tekening)
12
1.5.2 Situatie samengestelde tekeningen Een samengestelde tekening wordt in de regel gemaakt op aanvraag van de klant of naar eigen goeddunken voor het maken van nieuwsbrieven e.d. Een samengestelde tekening bestaat uit één of meer profielen met daarin eventueel accessoires getekend. Omdat er duizenden profielen zijn, zijn er ontelbare combinaties mogelijk. In veel gevallen is een nieuw te maken detail eenvoudig samen te stellen uit een eerder getekend detail. De snelste manier van tekenen is het oproepen van een eerder gemaakt detail en hierin een wijziging aan te brengen. Omdat we de oude tekening willen bewaren, zullen we de nieuwe, aangepaste tekening onder een nieuw nummer moeten opslaan.
1.5.2.1 Nummering van samengestelde tekeningen Voor het maken van samengestelde tekeningen zijn geen internationale afspraken gemaakt. Elk filiaal is in principe verantwoordelijk voor haar eigen tekeningen. Reynaers B.V. heeft besloten om deze tekeningen per documentatienummer in te delen. De naam van een bestand is op de volgende manier samengesteld:
XX–XX–XXXXX.dwg De eerste twee cijfers zijn de documentatiecodering. Voor elke productserie is een unieke cijfercodering gekozen. Deze codering is terug te vinden in de artikel- en paginanummers van de diverse documentatiemappen. De volgende twee cijfers vormen het tekeningtype. Zo is een basistekening voor de architect een type 01 en is een tekening die de toepassing van een artikel verduidelijkt een type 05. Deze typeringen en de documentatienummers zijn vastgelegd in een database. De laatste vijf cijfers zijn het volgnummer van de tekening. De relatief complexe nummering is gekozen om het handmatig opzoeken van tekeningtypen voor een bepaalde serie enigszins overzichtelijk te maken. De afspraken zijn vastgelegd in het "Handboek Tekenkamer". Om nu een samengestelde tekening een nieuw nummer te kunnen geven wordt vastgesteld voor welke serie de tekening dient en wat het doel van de tekening is. Het volgnummer wordt handmatig opgezocht en met 1 verhoogd. De tekening kan onder het nieuw verkregen nummer worden opgeslagen. Dit proces vereist nogal wat handelingen van de gebruiker. Eerst moet het nummer van een serie worden opgezocht in de betreffende documentatiemap. Dan moet uit het Handboek Tekenkamer het nummer worden opgezocht van het tekeningtype. Vervolgens wordt in de CAD-bibliotheek het laatste bestand opgezocht met de gevonden nummering. Het nieuwe bestand krijgt een volgnummer wat 1 hoger is dan het laatst gevonden bestand.
13
2
Probleemstelling Bij Reynaers B.V. is geconstateerd dat het beheer van vele duizenden tekeningen niet meer handmatig kan gebeuren. Er zal een oplossing moeten worden gezocht hoe de grote hoeveelheid van tekeningen kan worden ingedeeld en weer teruggevonden. We schetsen de knelpunten bij de huidige werkwijze en bespreken hier tevens een aantal wensen en eisen.
2.1 Knelpunten De grootste knelpunten zijn dat er veel tijd nodig is om een tekening te zoeken en dat het overzicht over zo'n 50.000 tekeningen na een tijdje enigszins zoekraakt. Het terugvinden van een volgnummer voor een samengestelde tekening neemt relatief veel tijd in beslag en omdat het handmatig gebeurt is de kans op fouten redelijk hoog. Omdat tekeningen handmatig worden opgeslagen kan het zijn dat een tekening in de verkeerde directory belandt. Tekeningen kunnen foutieve nummers krijgen, wat het terugzoeken van een bepaald type tekening bemoeilijkt. Het is wenselijk om per tekening aan te geven welke artikelen in deze tekening worden toegepast zodat het opzoeken van eerder gemaakte tekeningen gemakkelijker wordt. Handmatig invoeren van deze gegevens in een database of Excel bestand vergt tussen de vijf minuten en een kwartier per tekening. Dit wordt daarom vaak uitgesteld en uiteindelijk overgeslagen.
Afbeelding 6: Meer dan 50.000 tekeningen
Terugzoeken van samengestelde tekeningen is omslachtig en onoverzichtelijk. De tekeningen zijn per type ingedeeld in de CAD-directories, maar als voor een serie vele honderden tekeningen aanwezig zijn is het enorm tijdrovend om de goede basistekening terug te vinden. Omdat het opzoeken moeilijk is, wordt dit vaak overgeslagen, wat de kans dat een tekening dubbel of driedubbel wordt gemaakt, vergroot. Bij een tekenafdeling van één persoon is dit in de hand te houden, maar bij meerdere tekenaars loopt de kans op dubbel werk exponentiëel op.
14
2.2 Wensen Sinds een paar jaar is er een interne website aanwezig waarin gegevens kunnen worden opgezocht welke betrekking hebben op Reynaers producten. Het zou wenselijk zijn als hierin de beschikbare tekeningen kunnen worden getoond, zodat collega's buiten de technische dienst direct kunnen zien of een tekening reeds bestaat. Het zou gemakkelijk zijn zulke tekeningen direct per fax of e-mail door te kunnen sturen naar de klant. Als nu alle artikeltekeningen en samengestelde tekeningen automatisch kunnen worden gedocumenteerd met een minimum aan extra werk, dan zou dit de gehele organisatie ten goede komen. In de toekomst zou zelfs de klant op een dergelijke website zelf de benodigde detailtekeningen kunnen downloaden of, via iDrop functionaliteit, direct vanaf internet in een AutoCAD tekening kunnen slepen.
2.3 Zoeken naar een oplossing Het probleem dat vele duizenden tekeningen niet meer handmatig kunnen worden beheerd is het meest schrijnend in het geschetste werkproces. Het aantal tekeningen neemt dagelijks toe en steeds meer tijd gaat verloren met het opzoeken van bestaande tekeningen en controleren of een tekening al eerder is gemaakt. Vooral het documenteren van de gemaakte tekeningen is belangrijk en is nu bijzonder omslachtig. Met het recentelijk verdubbelen van de tekencapaciteit bij Reynaers B.V. is ook het probleem verdubbeld en een oplossing moet worden gezocht in het automatiseren van het werkproces. Centraal beheer is hier een belangrijk punt, hetgeen parallel loopt met de wens dat andere afdelingen toegang wensen tot de tekeningenbibliotheek. De reeds aanwezige database met artikelgegevens zou hiervoor kunnen worden aangepast en uitgebreid zodat de toegevoegde informatie kan worden opgeslagen.
2.4 Conclusie Een onderzoek zal worden gestart naar de mogelijkheid van automatisering van het tekeningenbeheer, afgestemd op de mogelijkheden van het netwerksysteem van Reynaers B.V. en de huidige werkmethodiek. Het is essentiëel dat de huidige werkwijze zoveel mogelijk gehandhaafd blijft, mede vanwege de afspraken met het hoofdkantoor, ten aanzien van de benaming van artikeltekeningen. Tevens is het zeer belangrijk dat zo min mogelijk extra handelingen nodig zijn voor eventueel toegevoegde functionaliteit. Nagestreefd wordt het aantal handelingen te verminderen ten opzichte van de huidige werkwijze en de snelheid te verhogen, waarbij zoveel mogelijk extra functionaliteit wordt gecreëerd. We kunnen concluderen dat als een oplossing wordt gezocht in het snel opzoeken en weer opslaan van tekeningen, waarbij de informatie in deze tekeningen direct in de aanwezige database wordt opgeslagen, twee doelen tegelijk worden bereikt. Het wordt voor de tekenaar gemakkelijker om tekeningen terug te vinden en met het intranetsysteem, gebaseerd op diezelfde database, kunnen alle medewerkers van Reynaers B.V. beschikken over dezelfde informatie.
15
3
Evaluatie van mogelijke oplossingen Voordat we de details van een automatiseringstraject gaan uitwerken moet aandacht worden besteed aan een aantal hoofdpunten; welke mogelijkheden biedt de oplossing, hoe zit het met aanpassingen in een vervolgtraject, wat zijn de kosten, wat is de te verwachten tijdbesparing? We zullen kort drie opties afwegen voor het starten van het project.
3.1 Optie 1: Kant-en-klare software aankopen Gezien de zeer specifieke indeling van producten en de wijze waarop documentatie en aanvullende tekeningen worden gemaakt is het bijzonder moeilijk om een standaardpakket te vinden wat geschikt is om bestaande tekeningen te beheren en het maken van nieuwe tekeningen te vergemakkelijken. Software voor volledig tekeningen- en revisiebeheer is wel aanwezig op de markt, maar is kostbaar. Een dergelijk pakket moet volledig aanpasbaar zijn om het af te kunnen stemmen op de huidige werkwijze. Het pakket zal uitgebreide scriptmogelijkheden moeten ondersteunen om de nodige invoervelden te kunnen genereren en de hoeveelheid tijd die gemoeid gaat met het onder de knie krijgen van de software is groot. Een pakket voor tekening- en revisiebeheer is reeds in gebruik bij de technische dienst van het hoofdkantoor. Hier worden de producten ontwikkeld en ingevoerd in een pakket, genaamd SmarTeam, wat zeer veel mogelijkheden biedt. Er is onderzocht of dit programma mogelijk te gebruiken was om de technische dienst van Reynaers B.V. te ondersteunen, maar het programma bleek erg kostbaar en moet tevens via Visual Basic worden aangepast. Dit kan extern gebeuren, maar de synchronisatie van gegevens van het hoofdkantoor met die van de filialen bleek erg lastig. Bovendien is het programma te uitgebreid voor de wensen van Reynaers B.V., waardoor van deze optie werd afgezien.
3.2 Optie 2: Software laten ontwikkelen Een andere oplossing is een programma te laten ontwikkelen door een extern bedrijf. Hoewel een dergelijke optie zeer goed mogelijk is, zijn de kosten die met zo'n project gemoeid zijn ook zeer hoog. Het gaat immers om maatwerk voor één bedrijf in een specifieke bedrijfstak. De reproduceerbaarheid van de geschreven software is derhalve bijna nihil, hetgeen de prijs enorm doet stijgen. Daarbij komt dat Reynaers B.V. dan voor elke aanpassing die nodig zou zijn afhankelijk is van een extern bedrijf. Planningen moeten dan gemaakt worden, gegevens uitgewisseld, offertes goedgekeurd door de directie, enz., enz.
3.3 Optie 3: Eigen software ontwikkelen Omdat getekend wordt met AutoCAD 2002, een CAD-pakket wat ondersteund is met Visual Basic for Applications, bestaat de mogelijkheid de gewenste aanpassingen in de tekenmethode in eigen huis te ontwikkelen. De verwachting is dat een ruime verbetering van de tekenmethode kan worden bereikt middels een aantal relatief kleine aanpassingen in AutoCAD. De te verwachten kosten zijn relatief laag en de controle over het eindproduct is hoog. Een zekere basiskennis van VBA en een grote beheersing van AutoCAD zorgen tevens voor een relatief kort en goedkoop ontwikkeltraject.
16
3.4 Conclusie Het aanschaffen van kant-en-klare software is geen goede optie. Een volledig standaardpakket bestaat niet en een pakket zal achteraf toch intern moeten worden aangepast. Dit vergt zeker zoveel tijd als het zelf ontwikkelen van een aantal routines, vooral omdat buiten de software om een aantal randvoorwaarden het ontwikkeltraject bepalen. Ook is het gebruiken van de reeds aanwezige database en tekeningenstructuur is een mogelijk struikelpunt. Het laten ontwikkelen van software door een extern bedrijf is een optie, maar hier kleven ook een paar nadelen aan. Het is kostbaar en de ontwikkeling moet zeer nauw worden opgevolgd. Hieraan kleeft ook een behoorlijke tijdsinvestering door intensief overleg en uitwerken van wensen. Ook het feit dat de database nog in ontwikkeling is maakt het uitbesteden van een dergelijk project lastig. Het in eigen huis ontwikkelen van een op AutoCAD geschreven pakketje is derhalve de beste optie. Aanpassingen op de database zijn gemakkelijk door te voeren waar nodig en de ontwikkelomgeving is reeds aanwezig. Het zal zeker een hoeveelheid tijd gaan kosten om alles goed op te zetten, maar veel van die tijd zou ook verloren gaan bij de coördinatie van een extern project of het aanpassen van bestaande software.
17
4
Vooronderzoek Voordat we echt kunnen gaan programmeren, zullen we eerst moeten onderzoeken wat nodig is om de werkwijze te verbeteren. Dit vooronderzoek behandelt uitgangspunten, stroomdiagrammen, benodigdheden en de hoofdopzet van het programma. Voor de werknaam van het project kiezen we "RCAD", ofwel Reynaers Computer Aided Design.
4.1 Uitgangspunten Ten grondslag aan RCAD ligt een aantal uitgangspunten. We maken onderscheid in de volgende zaken.
4.1.1 AutoCAD moet normaal blijven functioneren Het programma AutoCAD dient normaal te blijven werken. Dit houdt in dat geen van de intrinsieke functies van het pakket mogen worden aangepast. Enkel nieuwe functies zullen worden toegevoegd, welke de bestaande functionaliteit uitbreiden.
4.1.2 Gebruiksvriendelijke interface De interface van de toegevoegde functies dient duidelijk, overzichtelijk en intuitief te zijn. Een gebruiker moet snel begrijpen wat van hem of haar wordt verwacht. Het programma moet zorgen dat fouten niet kunnen worden gemaakt, in plaats van voor elke foutieve invoer een melding laten zien.
4.1.3 Modulair opzetten Het project wordt in delen uitgevoerd. Elk onderdeel is een losstaand programmaatje wat onafhankelijk van de overige onderdelen werkt. Op deze manier blijft het overzicht zoveel mogelijk bewaard voor de ontwikkelaar en kan elk onderdeel apart worden afgerond. Op de langere termijn zullen meerdere modules worden toegevoegd.
4.1.4 Zo min mogelijk handelingen verrichten Het aantal handelingen wat moet worden verricht om een onderdeel te bedienen moet tot het absolute minimum worden beperkt. Elke handeling is een mogelijke bron van fouten die weer opgelost of gecontroleerd moeten worden. Ook is elke extra handeling een mogelijke bron van tijdverlies, waardoor het eigenlijke doel voorbij wordt gestreefd.
4.1.5 Bestaande structuur blijft gehandhaafd De aanwezige directorystructuur dient als basis. Ook de nummering van artikeltekeningen en samengestelde tekeningen dient gehandhaafd te blijven. Met name op het gebied van artikeltekeningen is Reynaers B.V. gebonden aan de afspraken welke gemaakt zijn met het hoofdkantoor.
18
4.2 Opzet database Ten grondslag aan het functioneren van een bibliotheek van meer dan 50.000 tekeningen ligt een database. Het aantal gegevens wat moet worden beheerd is eenvoudigweg te groot om op een andere manier aan te spreken. De directorystructuren van Windows zijn te traag en programmatisch zoeken hierin is moeizaam. Tekstbestanden met zoveel informatie zijn te groot en ook een Excel-sheet is geen ideale structuur hiervoor. Er is in het voortraject daarom gekozen voor een Microsoft Access database. De Microsoft Office omgeving wordt reeds lange tijd gebruikt bij Reynaers B.V. en voor de opzet van een database hoefde derhalve geen software te worden aangekocht. De werkelijke structuur van de database is te omvangrijk en te complex om hier in zijn geheel te behandelen. Desalniettemin is het voor een aantal zaken essentiëel dat de basisstructuur voor de relevante routines besproken wordt. De belangrijkste tabellen zullen worden toegelicht.
4.2.1 Tabel "Artikel" Deze tabel bevat alle artikelnummers die door Reynaers worden gehanteerd. Alle informatie die direct terug te koppelen is op één artikel staat in deze tabel. Deze tabel wordt dagelijks actueel gehouden zodat ook nieuw geïntroduceerde artikelen direct opvraagbaar zijn. Met name voor het controleren van artikelnummers op geldigheid wordt deze tabel gebruikt. Ook om te zien of een artikel nog leverbaar is wordt hiernaar gerefereerd. Momenteel zijn 12.968 artikelen gedocumenteerd in het systeem.
4.2.2 Tabel "Artikel_Tekening" Deze tabel dient om artikeltekeningen te koppelen aan een artikelnummer. Het formaat, type en achtervoegsel van de bestandsnaam voor een bepaalde tekening wordt in deze tabel opgeslagen. Voor de historie van artikelgegevens wordt een tekening nooit verwijderd uit de tabel. Dit houdt in dat de tekeningenbibliotheek over de jaren alleen maar zal groeien. Momenteel zijn 30.485 artikeltekeningen hierin gedocumenteerd.
4.2.3 Tabel "Tekening" Deze tabel dient om samengestelde tekeningen in te registreren. Een korte omschrijving van de tekening is hierin opgenomen, alsmede de status van de tekening (ontwerp, actueel, vervallen). Elke tekening hierin komt exact één keer voor. Er zijn momenteel 909 tekeningen geregistreerd.
4.2.4 Tabel "ProfTek" Om te kunnen registreren welke artikelnummers worden toegepast in een samengestelde tekening maken we gebruik van deze tabel. Hierin wordt het tekeningnummer uit de tabel "Tekening" rechtstreeks gekoppeld aan artikelnummers uit de tabel "Artikel". Als nu een samengestelde tekening op nummer wordt opgevraagd is middels deze tabel direct te zien welke artikelen hierin getekend staan. Momenteel zijn 4007 artikelen gekoppeld aan 909 samengestelde tekeningen.
4.3 Theoretische opzet programma Om informatie vanuit een tekening in AutoCAD te kunnen opslaan in de database dient een aantal zaken goed te worden bekeken. De gekozen databasekoppeling bepaalt de mate van controle die het programma kan uitvoeren en de snelheid waarmee gegevens kunnen worden opgevraagd. Een voorstel moet worden gemaakt voor de interface-onderdelen van het programma. Deze stellen de gebruiker in staat met het beheersysteem te communiceren.
19
4.3.1 Database Een gegeven is de Access database "RBase". Deze database dient niet alleen ter ondersteuning van RCAD, maar beheert tevens de intranetsite en de artikelgegevens van Reynaers. Om deze database te kunnen gebruiken dienen we vanuit Visual Basic een koppeling te leggen zodat gegevens kunnen worden opgevraagd en, in een aantal gevallen, gewijzigd.
4.3.1.1 Databasekoppeling Voor de koppeling met de database kan bij gebruik van een native Windows database worden gekozen voor ADO of DAO. De eerste is snel en ondersteunt databases van vele duizenden elementen, de tweede is gemakkelijker aan te roepen in een Visual Basic omgeving, maar is langzamer en niet geschikt voor hele grote databases. Gekozen werd voor een ADO koppeling vanwege de snelheid.
4.3.2 Interface Gezocht wordt naar een mogelijkheid om tekeningen snel te vinden en gemakkelijk op te roepen, alsmede de mogelijkheid om tekeningen snel en slim op te slaan en te koppelen aan de database. Het lijkt dus verstandig om een zoekroutine te maken en een schrijfroutine. Onderzoek zal moeten uitwijzen of deze elementen voor verschillende tekeningtypes te uniformiseren zijn.
4.3.2.1 Zoekroutine Om een goede indeling te kunnen maken voor een zoekroutine, moeten we eerst te weten komen wat gewenst wordt bij het opzoeken van tekeningen. De volgende mogelijkheden dienen te worden opgenomen in de zoekroutine: • Tekeningen op nummer opzoeken. • Alle samengestelde tekeningen opvragen waarin een Reynaers artikel is gebruikt. • Controleren of een samengestelde tekening al eerder is gemaakt. • Tekeningen opvragen welke van toepassing zijn op een Reynaers serie. • Een voorbeeld van een gevonden tekening tonen in een venster. • Gevonden tekeningen moeten kunnen worden geopend, als blok in een tekening gelezen of als externe referentie aan een tekeningen gekoppeld. We zullen aan de hand van de uitwerking van het programma toelichten hoe de gewenste mogelijkheden zijn geïmplementeerd in het programma.
4.3.2.2 Schrijfroutine De schrijfroutine zal gaan dienen om een gemaakte of gewijzigde tekening op te slaan in de bibliotheek en de gegevens van deze tekening te koppelen aan gegevens in de database. Het gaat om de volgende zaken: • Artikelnummers moeten worden gekoppeld aan een samengestelde tekening. • Samengestelde tekeningen moeten in de database worden opgeslagen onder een nieuw nummer, te bepalen a.h.v. de Reynaers serie en het tekeningtype. • Tekeningen in DXF, PNG, JPG, PDF en DWF formaat moeten automatisch kunnen worden gegenereerd bij het opslaan van een tekening. Dit ter ondersteuning van informatieverstrekking aan klanten en het tonen van afbeeldingen op de Reynaers website.
20
5
Werking van het programma De uitwerking van de theoretische opzet resulteert in een werkend programma, genaamd RCAD. Hoe RCAD tot stand is gekomen en welke elementen eraan ten grondslag liggen wordt in dit hoofdstuk uitgelegd. Twee formulieren bepalen de interface met de database voor RCAD. We gebruiken één formulier voor de zoekroutine en één voor de schrijfroutine. Aangezien RCAD alles uitvoert vanuit de twee hoofdformulieren, zal aan de hand van deze elementen de werking van het programma worden toegelicht.
5.1 Zoekroutine: formulier "fmFind" Dit formulier wordt gebruikt om tekeningen te zoeken. Het formulier bestaat uit een aantal hoofdcomponenten welke kort worden omschreven. Naderhand zal de werking van het programmagedeelte voor dit formulier worden uitgelegd.
Afbeelding 7: Formulier "fmFind"
21
5.1.1 Componenten op formulier "fmFind" De componenten of groepen van componenten zijn aanwezig op het formulier. 1 Listview voor seriekeuze Omdat Reynaers al haar producten opdeelt in series is gevraagd om een mogelijkheid om artikeltekeningen weer te geven aan de hand van een gekozen serie. Na enig overwegen is gekozen voor een listview control. Dit element kan pictogrammen weergeven welke geselecteerd kunnen worden met de muis. Omdat Reynaers series met eenvoudige plaatjes kunnen worden geïdentificeerd is gekozen dit met een grafisch element te doen. Als een serie gekozen wordt, vult het programma de treeview (element 3) met alle gevonden tekeningen voor die serie. Hiervoor zijn alle artikelen gekoppeld aan één of meerdere series. Een selectie wordt gemaakt op de koppeltabel Artikel_Serie en deze wordt gecombineerd met de tabel Artikel_Tekening om tot een lijst van artikelen te komen waarvoor tekeningen in de bibliotheek aanwezig zijn. 2 Invoervelden voor zoekopdracht Dit element bevat de invoervelden voor de eigenlijke zoekopdracht. Als artikeltekeningen worden gezocht, kiest de gebruiker het tabblad "Article search", als samengestelde tekeningen worden gezocht, kiest de gebruiker voor "Section search", enz. Momenteel zijn enkel deze twee tekeningtypen geïmplementeerd. Als een artikeltekening wordt gezocht kan de gebruiker het artikelnummer invoeren in het veld "Article pattern". Als hier zeven letters en/of cijfers zijn ingevoerd, zoekt het programma op of de gegeven tekst kan worden vertaald naar een artikelnummer. Als dit zo is, worden alle tekeningen gezocht die aan dit artikelnummer gekoppeld zijn. Als een sterretje ("*") wordt ingevoerd, worden alle artikelen gezocht die beginnen met de tekens die voor het sterretje staan. Als bijvoorbeeld als zoekopdracht "005*" wordt getypt, worden alle artikelen weergegeven die beginnen met "005" waarvoor tekeningen gevonden worden. Hetzelfde principe geldt voor samengestelde tekeningen. Als het tekeningnummer een samengestelde tekening oplevert, dan wordt deze in de treeview geplaatst. Ook hier kan met een sterretje een aantal tekeningen tegelijk worden gezocht. 3 Treeview voor weergeven van resultaten Dit element toont alle gevonden tekeningen. In het article search tabblad worden tekeningen weergegeven, gesorteerd op artikelnummer. Alle tekeningen die gekoppeld zijn aan het artikelnummer worden in een mapje geplaatst wat afzonderlijk kan worden geopend. Een voorbeeld van zoekresultaten is weergegeven in Afbeelding 8.
22
Afbeelding 8: Zoekresultaten voor artikeltekeningen
Zoals weergegeven worden gevonden doorsnedetekeningen in een mapje onder het artikelnummer geplaatst. Alle tekeningen van het type DWG, DXF en DWF kunnen worden geselecteerd in de treeview, waarna in het vakje "Preview" de tekening wordt getoond. 4 Voloview voor weergeven van tekening Dit element toont de tekening die geselecteerd is in de treeview control. De gekozen tekening staat op dat moment opgeslagen in de src-property van de VoloView control. Als een tekening geselecteerd is, dan worden de knoppen "Insert", "Reference" en "Open" geactiveerd. 5 Bedieningsknoppen treeview Omdat soms de lijst van tekeningen nogal groot kan worden zijn drie knoppen aangebracht welke de lijst bedienen. De knop "Expand All" vouwt alle tekeningen uit, de knop "Collapse All" vouwt alle tekeningen weer dicht tot het hoogste niveau en de knop "Clear Results" maakt de lijst leeg voor een nieuwe zoekopdracht. 6 Bedieningsknoppen formulier Deze knoppen worden gebruikt om een geselecteerde tekening te openen ("Open"), als blok in te lezen in de tekening ("Insert") of als XRef aan de tekening te koppelen ("Reference"). Zij worden enkel geactiveerd als een tekening is geselecteerd. Dit ter voorkoming van fouten.
23
7 Imagelists voor opslaan van iconen Deze elementen dienen om alle iconen die worden gebruikt in de listview en treeview controls op te slaan. Omdat slechts één afmeting iconen kan worden opgeslagen en de listview grotere afbeeldingen gebruikt dan de treeview, zijn twee afzonderlijke elementen opgenomen.
5.1.2 Hoe werkt de zoekroutine? Het volgende stroomschema geeft in het kort weer hoe de zoekroutine in zijn werk gaat.
Afbeelding 9: Stroomschema zoekroutine
5.1.3 Wat levert het op? We kunnen met de zoekroutine tekeningen opzoeken op nummer zonder daarbij in de directorystructuur van de CAD-bibliotheek te moeten zoeken. In plaats daarvan zorgt een eenvoudige boomstructuur voor een lijst van tekeningen, gesorteerd op artikel- of tekeningnummer. In plaats van zoeken naar een bestand, krijgt de tekenaar het idee dat hij of zij aan het zoeken is naar een Reynaers product. De tekenaar krijgt meer het gevoel dat met bekende gegevens gewerkt wordt. Ook het openen of invoegen van een tekening wordt gedaan vanuit hetzelfde venster. Waar bij AutoCAD gebruik gemaakt wordt van drie verschillende commando's (Open, Insert en XRef), wordt bij RCAD hetzelfde venster gebruikt voor alle open en invoegmethodes.
24
5.2 Schrijfroutine: formulier "fmWrite" Dit formulier wordt gebruikt om tekeningen op te slaan. Het formulier bestaat uit een aantal hoofdcomponenten welke kort worden omschreven. Naderhand zal de werking van het programmagedeelte voor dit formulier worden uitgelegd.
Afbeelding 10: Formulier "fmWrite"
1 Listview voor seriekeuze In dit element worden alle Reynaers series geplaatst waarvoor tekeningen worden gemaakt. Als in deze lijst een serie wordt geselecteerd, dan wordt in het vak "Section pattern" een nieuw nummer gegeven voor de samengestelde tekening. Als het tekeningtype of de serie wordt gewijzigd, dan past het programma automatisch het nummer aan en zoekt het laatste volgnummer op in de database. Dit nummer wordt verhoogd met 1 om het nieuwe volgnummer te krijgen. 2 Invoervelden voor essentiële tekeninggegevens Deze controls dienen voor de invoer van het tekeningtype, omschrijving van de tekening en eventuele opmerkingen. Het tekeningnummer wordt automatisch gegenereerd. Omdat de gebruiker hieraan niets kan wijzigen, maar het bij het wijzigen van een bestaande tekening wenselijk is een bestaand tekeningnummer in te voeren, is een knop opgenomen welke het tekeningnummer uit de naam van de huidige tekening haalt en in een tekstveld plaatst. Het tekeningtype wordt uit een combobox gekozen welke bij initialiseren van het formulier gevuld wordt vanuit de database. Omschrijving en opmerkingen zijn tekstvelden. Het omschrijvingsveld is verplicht en is geel gekleurd. Het opmerkingenveld is niet verplicht en daarom wit.
25
3 Listbox voor blokken die in de tekening gevonden werden Dit element geeft alle blokken weer die bij het aanroepen van het formulier gevonden werden in de tekening. Als een blok in de tekening bestaat en als element in modelspace is geplaatst, dan staat het automatisch geactiveerd. Als een blok wel in de blokkenverzameling van de tekening wordt gevonden, dan wordt het wel hier gemeld, maar niet geselecteerd. Het kan voorkomen dat het artikel van zo'n blok wel aan de tekening gekoppeld dient te worden. 4 Bedieningselementen voor het koppelen van artikelen aan de tekening Deze drie knoppen dienen om een artikelnummer toe te voegen die niet in de lijst komen (dit kan gebeuren als een blok geëxplodeerd moest worden), artikelen van de lijst met gevonden blokken te verplaatsen naar de lijst met te koppelen artikelen, en artikelen te verwijderen uit de lijst met gekoppelde artikelen. 5 Listbox voor artikelnummers die aan de tekening gekoppeld moeten worden Hierin komen bij een nieuwe tekening alle artikelen te staan die aan de tekening gekoppeld moeten worden. De koppeling wordt tot stand gebracht bij het opslaan van de tekening. Als de tekening al eerder is gemaakt en nu is aangepast, geeft deze lijst alle artikelen weer die eerder aan deze tekening gekoppeld werden. Met de bedieningsknoppen kunnen artikelen losgekoppeld worden en nieuwe artikelen toegevoegd. 6 Voloview voor weergeven van tekening Dit element wordt gebruikt om een bestaande samengestelde tekening te tonen. Van deze tekening zijn de bestanden al eens aangemaakt en kan het DWG-bestand worden getoond. Bij nieuwe tekeningen is dit nog niet mogelijk omdat VoloView een bestandsnaam nodig heeft om iets te kunnen tonen. 7 Bedieningsknoppen formulier Deze knoppen dienen om de opdracht te geven een bestand weg te schrijven (Save) of de functie af te breken (Cancel). 8 Imagelists voor opslag iconen Deze elementen dienen om alle iconen die worden gebruikt in de listview en treeview controls op te slaan. Omdat slechts één afmeting iconen kan worden opgeslagen en de listview grotere afbeeldingen gebruikt dan de treeview, zijn twee afzonderlijke elementen opgenomen.
5.2.2 Hoe werkt de schrijfroutine? De schrijfroutine controleert de tekening op blokken met Reynaers artikelnummers in de naam. Deze worden weergegeven in de listbox "Articles found in drawing" en de relevante blokken worden geselecteerd. De gebruiker kiest een serie in de listview links op het formulier, kiest een tekeningtype uit de lijst en vult een korte omschrijving in voor de tekening. In de lijst met gevonden artikelen wordt eventueel een aantal artikelen aan of uitgezet, waarna geselecteerde artikelen verplaatst worden naar de listbox "Articles connected to drawing". De tekening kan nu worden opgeslagen. Als een eerder met RCAD gemaakte tekening wordt opgeslagen met deze routine, dan wordt de lijst met "Articles connected to drawing" ingevuld vanuit de database. Met de bedieningsknoppen kunnen dan artikelen losgekoppeld worden en andere toegevoegd. Dit treedt met name op als een samengestelde tekening wordt gewijzigd (bijvoorbeeld als artikelen vervallen zijn of de tekening foutief is). Afbeelding 11 toont een voorbeeld van een de gegevens die worden ingevuld voor een bestaande samengestelde tekening.
26
Afbeelding 11: Resultaten samengestelde tekening
5.2.3 Wat levert het op? We kunnen met deze routine in vier korte stappen tekeningnummer bepalen, locatie in de CADbibliotheek opzoeken en artikelen koppelen aan de tekening. Met name de opzoekmogelijkheden van de tekening worden hiermee gegarandeerd. De tekening kan direct in de zoekroutine worden teruggevonden en de gebruiker heeft altijd de laatse informatie ter beschikking. Ook de verschillende bestandsformaten die voor website, drukker en klant ter beschikking worden gesteld worden automatisch gegenereerd zodat deze niet meer afzonderlijk moeten worden gemaakt. Met name het opzoekwerk in diverse handboeken voor de nummering van de serie en het tekeningtype wordt enorm versneld. Er hoeft niet meer te worden gebladerd in een boek, aangezien de gebruiker slechts tweemaal hoeft te klikken. Het volgnummer hoeft niet meer te worden opgezocht in de CAD-bibliotheek en handmatig te worden bepaald. Dit is één handeling minder.
27
5.3 Systeemeisen RCAD is ontwikkeld met een minimum aan systeemeisen in het achterhoofd. Het systeem zou moeten draaien op een standaard kantoorcomputer met AutoCAD en Microsoft Office geïnstalleerd. Een aantal componenten wat gebruikt wordt op de toegepaste formulieren is Windows-eigen, maar maakt gebruik van een aantal bibliotheken.
5.3.1 Lijst van Componenten Naast de componenten welke standaard voor Visual Basic for Applications beschikbaar zijn, wordt gebruik gemaakt van een aantal componenten welke dienen voor het overzichtelijker en intuitiever maken van de gebruikersinterface. De volgende componenten zijn toegevoegd: Tabel 5-1: Lijst van componenten Component Autodesk Volo View Control Microsoft ListView Control Microsoft ImageList Control Microsoft ProgressBar Control Microsoft TreeView Control
Versie 1.14 6.0 6.0 6.0 6.0
Referentie Autodesk Volo View Control Microsoft Windows Common Controls Microsoft Windows Common Controls Microsoft Windows Common Controls Microsoft Windows Common Controls
Bibliotheek avviewx.dll mscomctl.ocx mscomctl.ocx mscomctl.ocx mscomctl.ocx
28
6
Bijlagen Omdat de totale programmacode momenteel 82 pagina's beslaat, is hier gekozen om slechts een aantal onderdelen volledig als bijlage bij te voegen. Voor de echte spitter is de volledige programmacode op aanvraag beschikbaar, zij het enkel als Acrobat PDF-bestand. De relevante onderdelen worden hier toegelicht. Het volledige programma bevat ook nog een aantal onderdelen welke nog in ontwikkeling zijn.
6.1 Programmacode constantendefinities De verschillende programmaonderdelen maken gebruik van een aantal voorgedefiniëerde constanten. Deze worden gebruikt om de programmacode te verduidelijken, de code leesbaar te houden en voor eenvoudiger programmeerwerk. Deze code is opgenomen in de module "Main". De eerste regel is niet verplicht in VBA, maar wel wenselijk. Met "Option Explicit" wordt aangegeven dat alle variabelen die worden gebruikt ook eerst moeten worden gedeclareerd. Zo wordt in principe alleen geheugenruimte ingeruimd voor variabelen die correct zijn aangeroepen. Option Explicit 'Generic constants Public Const Pi = 3.14159265358979 Public Const rcNew = True
Er is voor een aantal functies gebruik gemaakt van de Enum constructie. Dit wil zeggen dat in een functieaanroep een variabele als een Enum kan worden aangeroepen. Als nu vanuit VBA de functie wordt ingetypt, dan komt zodra de betreffende optie wordt bereikt een lijst weergegeven van mogelijke opties (zie onderstaande afbeelding). De volgende twee constructies worden gebruikt in de rcDrawingPath functie. 'Constants from various lookup tables 'Drawing formats Public Enum rcDrawingFormat dwgFile = 0 dxfFile = 1 dwfFile = 2 epsFile = 3 jpgFile = 4 tifFile = 6 psdFile = 7 aiFile = 8 cdrFile = 9 tgaFile = 10 pngFile = 11 pdfFile = 12 End Enum 'Drawing shapes Public Enum rcDrawingShape rcDrawingStandard = 0 rcDrawingReshape = 10 rcDrawing3D = 20 rcDrawing3DModel = 30 rcDra wingRegion = 40 rcDrawingCatalogue = 50 rcDrawingArchive = 60 End Enum
'a, '1, 'a, '-'-'z '0,
b, c 2, 3 b, c
1, 2
'Plot files Public Const rcPlotDWF = "DWF Classic (R14 look).pc3" Public Const rcPlotJPG = "PublishToWeb JPG.pc3" Public Const rcPlotPNG = "Publis hToWeb PNG.pc3"
29
'Search options Public Const rcFindByCode = 0 Public Const rcFindBySeries = 1
De volgende twee constanten worden gebruikt om snel de basisformaten van AutoCAD te kunnen wijzigen. Het is bijvoorbeeld zo dat AutoCAD 2004 geen gebruik meer maakt van het R14 formaat. Nu is het zo dat voor de ondersteuning van onze klanten, die in veel gevallen met oudere versies van AutoCAD (LT) werken, wij het R14 formaat als standaard gebruiken. Dit zorgt ervoor dat wij niet de laatste versie kunnen gebruiken (dit had gekund via de instelling "acNative") 'Drawing format versions Public Const rcDWGVersion = acR14_dwg Public Const rcDXFVersion = acR12_dxf 'Paths Public Public Public Public Public
rcRBasePath As String rcSupportPath As String rcCADPath As String rcRC ADPath As String rcPrefsSupportPath() As String
'Dictionary objects Public rcDict As AcadDictionary Public rcXRecord As AcadXRecord Public rcXDataType As Variant Public rcXData As Variant
30
6.2 Programmacode functie rcArticleNumber Hier volgt de programmacode voor de artikelnummer zoekfunctie. De code zal extra worden toegelicht t.a.v. gemaakte keuzes. De invoer van de functie bestaat uit een willekeurige string van een willekeurig aantal tekens. Deze functie wordt gebruikt op alle plaatsen in de programmacode waar de geldigheid van een artikelnummer moet worden getoetst. Dit kan op twee manieren gebeuren: aan de hand van de database, of handmatig door de gebruiker. Zo wordt bijvoorbeeld bij het opzoeken van artikeltekeningen de gebruiker gevraagd om een artikelcode in te voeren. Voordat we het programma artikeltekeningen kunnen laten opzoeken, moeten we ervan verzekerd zijn dat het artikelnummer bestaat in de database. De functie rcArticleNumber controleert dan of datgene wat de gebruiker heeft ingevoerd een bestaand artikelnummer is. Dit dient voornamelijk ter voorkoming van overbodig werk door het programma en ter voorkoming van fouten als niet bestaande gegevens worden opgezocht. 'Function that returns the true article number of the string passed on t Public Function rcArticleNumber(ByVal sInput As String, _ Optional bCheckDatabase As Boolean = True) As String
o it
'Generic variables Dim i As Long Dim nTest As Integer Dim nFound As Integer Dim sArticle As String Dim vRes ult As Variant 'Database variables Dim wkRBase As Workspace Dim dbRBase As Database Dim rsArtikel As Recordset 'Open the database Set wkRBase = CreateWorkspace("", "Admin", "", dbUseJet) Set dbRBase = wkRBase.OpenData base(rcRBasePath) Set rsArtikel = dbRBase.OpenRecordset("Artikel") rsArtikel.Index = "PrimaryKey"
'Open the database
Verwijder overbodige spaties uit de invoerstring en maak de string uppercase. Vergelijkingen tussen strings in Visual Basic worden enkel uitgevoerd op uppercase strings. Anders worden elementen als niet gelijk beschouwd ("ABCDE" <> "abcde") sInput = Trim(UCase(sInput))
De nummers van samengestelde tekeningen zijn opgebouwd uit cijfers en streepjes. Omdat deze functie streepjes niet ziet als geldige invoer (geen enkel artikelnummer bevat streepjes), worden deze eruit gefilterd. Omdat dit zou kunnen betekenen dat een nummer van een samengestelde tekening een identiek artikelnummer oplevert, worden deze als niet geldig beschouwd. De functie rcDrawingNumber wordt hiervoor aangeroepen. 'Exclude drawing numbers If rcDrawingNumber(sInput, False) <> "" Then 'sInput is a drawing number, return empty string rcArticleNumber = "" Exit Function E nd If
Alle ongeldige tekens en informatie wordt verwijderd uit de invoerstring. Als een '\' gevonden wordt, beschouwen we de invoer als een volledig bestandspad. We verwijderen dan alle padinformatie. Streepjes '-', underscores '_' en punten '.' werden soms als artikelformattering gebruikt in oude tekeningen en worden verwijderd. Geldige tekens zijn alle cijfers en letters. We controleren op ASCII code.
31
'Check for article numbers If Len(sInput) >= 6 Then 'Delete path information, if present While InStr(1, sInput, " \") > 0 sInput = Right(sInput, Len(sInput) Wend 'Delete file extension If InStr(1, sInput, ".") = Len(sInput) sInput = Left(sInput, Len(sInput) End If
- InStr(1, sInput, "
\"))
- 3 Then - 4)
'Remove all invalid characters from the string For i = 1 To Len(sInput) nTest = Asc(UCase(Mid(sInput, i, 1))) If nTest < 48 Or (nTest > 57 And nTest < 65) Or nTest > 90 Then 'Invalid character found, remove it Else 'Add valid character to the string sArticle = sArticle & UCase(Mid(sInput, i, 1)) End If Next i sInput = sArticle
Voor speciale ontwikkelingen bij Reynaers werd in het verleden '0s' gebruikt als eerste twee tekens in het artikelnummer. Later werd dit 'os', maar niet overal is dit aangepast. Soms komen we oude artikelnummers tegen. In de onderliggende database zijn alle artikelen met '0s' vervangen door artikelen met 'os', maar in oude tekeningen niet. 'Check for 0s and 0t constructions If Left(sInput, 3) = "00S" Then sInput = "0OS" & Right(sInput, Len(sInput) ElseIf Left(sInput, 3) = "00 T" Then sInput = "0OT" & Right(sInput, Len(sInput) End If
- 3) - 3)
'Validate the remainder of the string for invalid characters and length If Len(sInput) <= 5 Then 'String does not contain enough characters to be an article number Exit Function ElseIf Len(sInput) >= 20 Then 'String is too long to contain only article number information Exit Function End If
Een aantal jaar geleden werden artikelnummers ingevoerd met zes cijfers. Omdat soms oudere tekeningen worden gecontroleerd werd gekozen voor de optie deze artikelnummers ook als geldige waarden te beschouwen. Eerst zal worden gezocht of een artikelnummer wordt gevonden met zeven cijfers, als dit niet het geval is, wordt gezocht naar zescijferige nummers met een '0' ervoor geplaatst. 'Search for the article in the database if a check is required '(standard = True) If bCheckDatabase Then 'First, assume the number consists of 7 digits: ' (check for the first 7 characters, ' only if last character is a number) If Len(sInput) >= 7 Then rsArtikel.Seek "=", Left(sInput, 7) If rsArtikel.NoMatch Then 'The assumption was wrong, 'the article number consists of 6 characters or isn't valid: rsArtikel.Seek "=", "0" & Left(sInput, 6) If rsArtikel.NoMatch Then 'The artic le number is invalid: ' it wasn't found in the database in either case rcArticleNumber = "" Exit Function
32
Else 'The article number consist s of 6 digits rcArticleNumber = rsArtikel("Artikel") Exit Function End If Else rcArticleNumber = rsArtikel("Artikel") End If 'If the number couldn't consist of 7 digits for lack of enough positions, 'check for 6 characters ElseIf Len(sInput) >= 6 Then rsArtikel.Seek "=", "0" & Left(sInput, 6) If rsArtikel.NoMatch Then 'The article number is invalid: it wasn't found in the database rcArticleNumber = "" Exit Function Else 'The article number consists of 6 digits rcArticleNumber = rsArtikel("Artikel") Exit Function End If Else 'The string wasn't long enough to contain a full article number, 'return an empty string rcArt icleNumber = "" End If Else
De waarde bCheckDatabase is False. Dit houdt in dat we niet in de database gaan kijken of het artikelnummer geldig is. Dit is hoofdzakelijk omdat soms een nieuw artikelnummer wordt gevraagd om in te kunnen voeren in de database. We moeten dan echter wel de gebruiker vragen of het ingevoerde artikelnummer een geldig nieuw artikel is. Als de gebruiker reageert met 'yes', retourneert de functie het ingevoerde artikelnummer. 'Validate the article num ber If Len(sInput) = 7 Then vResult = MsgBox("Is article number " & sInput & " correct?", _ vbYesNo, "Check article number") If vResult = vbYes Then rcArticleNumber = sInpu t Exit Function End If ElseIf Len(sInput) = 6 Then vResult = MsgBox("Is article number 0" & sInput & " correct?", _ vbYesNo, "Check article number") If vRes ult = vbYes Then rcArticleNumber = "0" & sInput Exit Function End If ElseIf Len(sInput) > 7 Then vResult = MsgBox("Is article number " & Left(sInput, 7) & _ " correct?", vbYesNo, "Check article number") If vResult = vbYes Then rcArticleNumber = Left(sInput, 7) Exit Function Else vResult = MsgBox("Is article number 0" & Left(sInput, 6) & " _ correct?", _ vbYesNo, "Check article number") If vResult = vbYes Then rcArticleNumber = "0" & Left(sInput, 6) End If En d If End If End If End If End Function
33
6.3 Programmacode functie rcDrawingPath Deze functie dient om de fysieke locatie terug te vinden van een tekeningbestand in de CADbibliotheek. De functie vraagt een string als invoer en een aantal optionele waarden. Als de naam van een volledig bestand wordt ingevoerd, worden deze optionele waarden programmatisch bepaald. Als een artikelnummer wordt ingevoerd en de optionele waarden worden ingesteld dan bepaalt deze functie de plaats binnen de CAD-bibliotheek waar het bestand moet komen te staan. Deze functie dient om aan de hand van een aantal basisgegevens op te zoeken waar in de CADbibliotheek een tekening moet staan. Zoals in paragraaf 1.5 reeds is aangegeven is de CADbibliotheek opgedeeld in een aantal directories. Alle tekeningen worden op basis van type en bestandsformaat weggeschreven. Om te voorkomen dat de gebruiker zelf zijn bestanden in een verkeerde directory plaatst, zoekt RCAD op waar een gegeven tekening moet worden opgeslagen. Als in deze functie een bestandsnaam wordt opgegeven, bijvoorbeeld "0010136.dwg", zonder de optionele gegevens in te voeren, dan geeft de functie het volledige bestandspad op van dit bestand. Alle bestanden zijn immers uniek genummerd, dus er kan geen twijfel bestaan waar dit bestand kan worden teruggevonden. Het resultaat van deze zoekroutine is dan ook "[Pad van CAD-bibliotheek]\dwg\Profiel\0010136.dwg". Het basispad wordt uit de Windows registry gehaald. 'Function that returns the full drawing path, acco Public Function rcDrawingPath(ByVal sFile As String, _ Optional iFormat As Integer = -1, _ Optional iShape As Integer = -1, _ Optional iNumber As Integer, _ Optional bNew As Boolean) As String
rding to drawing type, file type
'Gene ric variables Dim i As Long Dim sArticle As String, sAppendix As String, sSuffix As String Dim sArtNum As String, sDrawing As String, sModel As String 'Database variables Dim wkRBase As Workspace Dim dbRBase As Database Dim rsArtikel As Recordset Dim rsArtDrawing As Recordset Dim rsArtType As Recordset Dim rsTekening As Recordset Dim rsTekType As Recordset Dim rsTekVorm As Recordset Dim rsTekFormaat As Recordset
We controleren voordat we de functie uit gaan voeren of RCAD goed geïnstalleerd is. Als bijvoorbeeld de registry gegevens zijn verwijderd, kan RCAD de paden naar de CAD-bibliotheek niet vinden. Als deze waarden niet zijn ingesteld, leveren alle functies die refereren naar de database of CAD-bibliotheek, fouten op. Om dit te voorkomen is deze controle ingebouwd. De functie rcCheckInstall wordt verderop toegelicht. Call rcCheckInstall
Eerst gaan we controleren of de invoerstring een artikelnummer, tekeningnummer of modelnummer is. Aangezien deze drie formaten uit een verschillend aantal tekens bestaat, kunnen we op deze manier elk bestand uniek onderscheiden. 'Check for article or drawing numbers sArtNum = rcArticleNumber(sFile) sDrawing = rcDrawingNumber(sFile) sModel = rc ModelNumber(sFile) If sArtNum <> "" And sDrawing <> "" And sModel <> "" Then sArtNum = "" If sArtNum <> "" And sDrawing <> "" Then sArtNum = ""
34
'Check if optional parameters were given If iFormat = -1 Then 'If no format was giv en, the input string should be a filename with 'all required parameters present 'Determine file format If InStr(1, sFile, ".") = 0 Then 'The filename does not have an extension separated by a '.' rcDrawingPat h = "" Exit Function End If
Controleer of de bestandsextensie een door RCAD ondersteund formaat is. Als de bestandsextensie langer of korter is dan drie tekens kan RCAD het bestand niet identificeren en beëindigt de routine. If InStr(1, sFile, ".") <> Len(sFile) - 3 Then 'Drawing file extension is not three characters long rcDrawingPath = "" Exit Function End If
Als de optionele waarde voor iFormat niet is meegegeven, dan zoeken we hier op wat voor type bestand het betreft. We controleren de bestandsextensie die in de bestandsnaam is meegegeven. 'Determine the iFormat variable through the file extension Select Case UCase(Right(sFile, 3)) Case "D WG" iFormat = dwgFile Case "DWF" iFormat = dwfFile Case "DXF" iFormat = dxfFile Case "EPS" iFormat = epsFile Case "TIF" iFormat = tifFile Case "JPG" iFormat = jpgFile Case "TGA" iFormat = tgaFile Case "PNG" iFormat = pngFile Case "PDF" iFormat = pdfFile Case Else 'Format not recognised, exit function rcDraw ingPath = "" Exit Function End Select 'Find out if the supplied string contains an article number, 'model number, or drawing number If Left(sFile, 7) <> sArtNum And Left(sFile, 11) <> sDrawing And _ Left(sFile, 5) <> sModel Then 'Filename does not contain a properly formatted number, 'so the file is either an old file or was not indexed properly rcDrawingPath = "" Exit Function End If 'Remove the file extension from the file string sFile = Left(sFile, Len(sFile) - 4)
35
Artikelnummers worden gecontroleerd aan de hand van de opgestelde regels, zoals eerder beschreven in Hoofdstuk 1. De volgende code bepaalt het artikelnummer-achtervoegsel en het tekeningtype. 'Article number is formatted properly If sArtNum <> "" Then sArticle = UCase(Left(sFile, 7)) sAppendix = UCase(Right(sFile, Len(sFile) - 7)) If sA rticle <> "" Then 'Article number found, check for drawing type If sAppendix = "" Then 'Standard drawing file If iFormat = rcDWG Or iFormat = rcDXF Then iShape = rcDrawingStandard Else iShape = rcDrawingCatalogue End If ElseIf Len(sAppendix) = 1 Then 'Article extension is 'a', 'b', 'p', 'z', etc. If sAppendix = "Z" Then iShape = rcDrawingCatalogue sAppendix = "" ElseIf sAppendix = "P" Then iShape = rcDrawingRegion sAppendix = "" ElseIf sAppendix = "V" Then iShape = rcDrawingReshape sAppendix = "" ElseIf sAppendix = "3" Then iShape = rcDrawing3D sAppe ndix = "" Else iShape = rcDrawingStandard iNumber = Asc(sAppendix) - 63 sAppendix = Chr(iNumber + 95) End If ElseIf Left(sAppend ix, 1) = "V" Then 'Article drawing is a reshaped 2d drawing iShape = rcDrawingReshape iNumber = Val(Right(sAppendix, Len(sAppendix) sAppendix = CStr(iNumber) ElseIf Left(sAppendix, 1) = "3" Then 'Article drawing is a 3d isometric iShape = rcDrawing3D iNumber = Asc(Right(sAppendix, 1)) - 63 sAppendix = Chr(iNumber + 95) ElseIf Left(sAppendix, 3) = "Z -X" Then iShape = rcDrawingArchive iNumber = Val(Right(sAppendix, Len(sAppendix) sAppendix = CStr(iNumber - 1) ElseIf sAppendix = " -3DM" Then 'Article drawing is a 3d model iShape = rcDrawing3DModel sAppendix = "" Else sAppendix = "" End If End If End I f
- 1))
- 3)) + 1
Else 'Drawing code always properly formatted sArticle = sFile End If
36
Nu hebben we de basisgegevens bepaald voor het opzoeken van het opgegeven bestand. We gaan nu in de database zoeken naar het opgegeven tekeningbestand en stellen het volledige bestandspad samen. 'Create connections with the database Set wkRBase = CreateWorkspace("", "admin", "", dbUseJet) Set dbRBase = wkRBase.OpenDatabase(rcRBasePath) 'Open the database Set rsTekVorm = _ dbRBase. OpenRecordset("SELECT * FROM TekVorm WHERE TekVorm = " & iShape) Set rsTekFormaat = _ dbRBase.OpenRecordset("SELECT * FROM TekFormaat WHERE TekFormaat = " & iFormat)
De basis voor het bestandspad is de constante voor de CAD-directory, gedefiniëerd in de module "Main". 'First, get the base settings for the CAD directories from the registry rcDrawingPath = rcCADPath 'Check for DWF files, they always have the same drawing shape Select Case iFormat Case rcDWG, rcDXF If rsTekVorm.RecordCount > 0 Then sSuffix = Format(rsTekVorm("Achtervoegsel")) Else sSuffix = "" End If Case Else iShape = rcDrawingCatalogue sSuffix = "" End Select
De CAD-directory is opgedeeld in subdirectories voor elk bestandsformaat. Aan de bestandsextensie kunnen we zien welke directory we moeten hebben. Deze wordt aan het pad toegevoegd. 'Enumerate the file format rcDrawingPath = rcDrawingPath & rsTekFormaat("Extensie") &
"\"
'Check what kind of drawing is expected If Len(sArtNum) = 7 Then 'Drawing is an article drawing Set rsArtikel = dbRBase.OpenRecordset("SELECT * FROM Artikel WHERE Artikel = '" _ & sArtNum & "'") 'Check to see if a new filename should be generated If bNew = True Then Set rsArtDrawing = _ dbRBase.OpenRecordset("SELECT * FROM Artikel_Tekening WHERE Artikel = '" _ & sArtNum & "' AND TekFormaat = " & iFormat & " AND TekVorm = " _ & iShape & " ORDER BY Achtervoegsel") If rsArtDrawing.RecordCount > 0 Then rsArtDrawing.MoveLast rsArtDrawing.MoveFirst Select Case iShape Case rcDrawingStandard, rcDrawing3D 'Appendix is a, b, c, etc. sAppendix = Chr(rsArtDrawing.RecordCount + 96) Case rcDrawingReshape 'Appendix is 2, 3, 4, etc . sAppendix = CStr(rsArtDrawing.RecordCount + 1) Case rcDrawingArchive 'Appendix is 1, 2, 3, etc. sAppendix = CStr(rsArtDrawing.RecordCount) Case Else 'Drawing shape does not support additional filenames, 'return to normal procedure sAppendix = "" End Select
37
Else Select Case iShape Case rcDrawingArc hive 'Appendix is 1, 2, 3, etc., as it starts with '0', 'this is different from other files sAppendix = "0" Case Else 'New file in the list has no extension oth er than the listed one sAppendix = "" End Select End If ElseIf iNumber > 0 Then 'Return article drawing # Select Case iShape Case rcDrawingStandard, rcDrawing3D '"", a, b, etc. If iNumber > 1 Then sAppendix = Chr(iNumber + 95) Else sAppendix = "" End If Case rcDrawingReshape '"", 2, 3, e tc. If iNumber > 1 Then sAppendix = CStr(iNumber) Else sAppendix = "" End If Case rcDrawingArchive '0, 1, 2, etc. sAppendix = CStr(iNumber - 1) Case Else If iNumber > 1 Then sAppendix = Chr(iNumber + 95) Else sAppendix = "" End If End Select I f sAppendix = "" And sSuffix = "" Then Set rsArtDrawing = _ dbRBase.OpenRecordset("SELECT * FROM Artikel_Tekening WHERE Artikel = '" _ & sArtNum & "' AND TekFormaat = " & iFormat & " AND TekVorm = " & iShape _ & " AND (Achtervoegsel Is Null OR Achtervoegsel = '') ORDER BY" & _ & " Achtervoegsel") Else Set rsArtDrawing = _ dbRBase.OpenRecordset("SELECT * FROM Artikel _Tekening WHERE Artikel = '" _ & sArtNum & "' AND TekFormaat = " & iFormat & " AND TekVorm = " & iShape _ & " AND Achtervoegsel = '" & rsTekVorm("Achtervoegsel") & sAppendix _ & "' ORDER BY Achter voegsel") End If If rsArtDrawing.RecordCount = 0 Then 'The requested drawing was not found in the list and 'no new drawing was requested rsArtDrawing.Close rsArtikel.Cl ose dbRBase.Close wkRBase.Close rcDrawingPath = "" Exit Function End If Else 'Return the first article in the list if no drawing number was supplied Set rsArtDrawing = _ dbRBase.OpenRecordset("SELECT * FROM Artikel_Tekening WHERE Artikel = '" _ & sArtNum & "' AND TekFormaat = " & iFormat & " AND TekVorm = " & iShape _ & " ORDER BY Achtervoegsel") End If
38
'If no article was found, call is invalid If rsArtikel.RecordCount <= 0 Then rcDrawingPath = "" Exit Function End If 'Enumerate the article type Set rsArtType = dbRBa se.OpenRecordset("ArtikelType") rsArtType.Index = "PrimaryKey" rsArtType.Seek "=", rsArtikel("Type")
Bepaal de directory voor artikeltype. Select Case rsArtType("UitvoerType") Case 0 'Article type is a profile Select Case iShape Case Is < 30 rcDrawingPath = rcDrawingPath & "Profiel \" Case 30 rcDrawingPath = rcDrawingPath & "Profiel 3d \" Case 40 rcDrawingPath = rcDrawingPath & "Voorbereiding 3d \" Case 50 rcDrawingPath = rcDrawingPath & "docAlgemeen \" Case 60 rcDrawingPath = rcDrawingPath & "algArchief \" End Select Case Is < 99 'Article type is accessory or machinery Select Case iShape Case Is < 30 If iFormat < 4 Then rcDrawingPath = rcDrawingPath & "Access \" Else rcDrawingPath = rcD rawingPath & "docAlgemeen \" End If Case 30 If iFormat < 4 Then rcDrawingPath = rcDrawingPath & "Access 3d \" Else rcDrawingPath = rcDrawingPath & "docAlgemee n\" End If Case 40 If iFormat < 4 Then rcDrawingPath = rcDrawingPath & "Voorbereiding 3d Else rcDrawingPath = rcDrawingPath & "docAlgemeen \" End If Case 50 rcDrawingPath = rcDrawingPath & "docAlgemeen \" Case 60 If iFormat < 4 Then rcDrawingPath = rcDrawingPath & "algArchief \" Else rcDrawingPath = rcDrawingPath & "docAlgemeen \" End If End Select Case Else 'Other article types do not have drawings that apply rcDrawingPath = "" rsArtDrawing.Close rsArti kel.Close Exit Function End Select rsArtDrawing.Close rsArtikel.Close
\"
rcDrawingPath = rcDrawingPath & sArtNum & sSuffix & sAppendix & "." _ & rsTekFormaat("Extensie")
39
ElseIf Len(sDrawing) = 1 1 Then 'Drawing is a section drawing Set rsTekening = _ dbRBase.OpenRecordset("SELECT * FROM Tekening WHERE TekNr = '" _ & sDrawing & "'") If rsTekening.RecordCount > 0 Then Set rsTekType = _ dbRBase.OpenRecordset("SELECT * FROM TekType WHERE TekType = " _ & rsTekening("TekType")) rcDrawingPath = rcDrawingPath & rsTekType("Directory") & " \" Else rcDrawingPath = "" Exit Func tion End If rcDrawingPath = rcDrawingPath & sDrawing & "." _ & rsTekFormaat("Extensie") ElseIf Len(sModel) = 5 Then 'Drawing is a model drawing rcDrawingPath = rcDrawingPath & "algModel \" & sModel & & rsTekFormaat("Extensie") Else 'Drawing file is invalid rcDrawingPath = "" Exit Function End If
"." _
'Check if the file exists, return a string only if it does If Dir(rcDrawingPath) = "" And Not bN ew = True Then rcDrawingPath = "" Exit Function End If 'Close the database dbRBase.Close wkRBase.Close End Function
40
6.4 Programmacode routine rcFindArticleDrawings Deze routine is het kenmerkende onderdeel van het formulier "fmFind" en dient om de treeview control op dit formulier te vullen met alle gerelateerde tekeningen. Deze routine wordt aangeroepen zodra de gebruiker een geldige waarde heeft ingevoerd in het betreffende tekstveld. Als bijvoorbeeld in een zoekopdracht voor artikeltekeningen zeven letters en/of cijfers zijn getypt, dan wordt deze routine automatisch aangeroepen. Er hoeft niet op de "Enter" toets te worden gedrukt of op een knop geklikt met de muis. Private Sub rcFindArticleDrawings(nListOptions As Integer) 'Generic variables Dim i As Long, j As Long Dim sText As String, sSQL As String, sSelection As String Dim bFound As Boolean, bFillList As Boolean, bProfile As Boolean Dim bOther As Boolean, bCurrent As Boolean Dim vResult As Varia nt 'Database variables Dim wkRBase As Workspace Dim dbRBase As Database Dim rsArtikel As Recordset Dim rsArtikelTek As Recordset Dim rsProfTek As Recordset Dim rsTekeningArt As Recordset Dim rsTekFormaat As Recordset 'Initialise the database Set wkRBase = CreateWorkspace("", "admin", "", dbUseJet) Set dbRBase = wkRBase.OpenDatabase(rcRBasePath)
'Open the database
'Evaluate options bProfile = checkProfiles.Value bOther = checkOther.Va lue bCurrent = checkCurrent.Value sSelection = ""
De optie nListOptions geeft aan welke zoekopdracht moet worden gegeven. We zoeken momenteel ofwel per serie, ofwel op ingevoerd artikelnummer. 'Create selection sets Select Case nListOptio ns Case rcFindByCode 'Option: list article drawings by article number sSQL = "SELECT Artikel.Artikel, Artikel.Omschrijving_ned, Status.Publish " & _ "FROM Artikel, Status WHERE Artikel LIKE '" & txArticle.Text & _ "*' AND Artikel.Status = Status.SearchID" Case rcFindBySeries 'Option: list article drawings by series sSQL = "SELECT DISTINCT Artikel.Artikel, Artikel.Omschrijving_ned, Status.Publish " & _ "FROM Artikel, Artikel_Pagina, Documentatie_Serie, Status " & _ "WHERE Artikel_Pagina.Artikel = Artikel.Artikel AND " & _ "Artikel_Pagina.Documentatie = Documentatie_Serie.DocGroep AND " & _ "Documentatie_Serie.SubSerieID = " & Right(lvwResults.Select edItem.Key, 4) End Select 'Options for the SQL string If bProfile And Not bOther Then sSQL = sSQL & " AND Type < 1000" ElseIf Not bProfile And bOther Then sSQL = sSQL & " AND Type >= 1000" End If If bCurren t Then sSQL = sSQL & " AND Status.Publish = TRUE" End If sSQL = sSQL & " ORDER BY Artikel.Artikel"
41
'Create the recordsets Set rsArtikel = dbRBase.OpenRecordset(sSQL) Set rsTekFormaat = dbRBase.OpenRecordset("TekFormaat") rsTekFormaat.Index = "PrimaryKey" 'Close all other drawing entries For i = 1 To Me.tvwResults.Nodes.Count If Me.tvwResults.Nodes(i).Expanded = True Then Me.tvwResults.Nodes(i).Expanded = False End If Next i
Er zijn tekeningen gevonden als de lijst rsArtikel meer dan één resultaat geeft. We tellen de recordset, als het resultaat groter dan 0 is, dan zijn tekeningen gevonden. If rsArtikel.RecordCount > 0 Then 'One or more articles were found rsArtikel.MoveLast rsArtikel.MoveFirst If rsArtikel.RecordCount > 100 Then sText = "You want to add " & Format(rsArtikel.RecordCount) & _ " drawings to the list." & vbCrLf & "This will take" If Int((rsArtikel.RecordCount / 960) + 0.5) < 1 Then sText = sText & " less than one minute to perform." & vbCrLf Else sText = sText & " approximately " & _ Format(Int((rsArtikel.RecordCount / 960) + 0.5), "#") sText = sText & " minutes." & vbCrLf End If sText = sText & "Do you wish to continue?" 'Ask user to continue, as there are a lot of articles in the search result vResult = MsgBox(sText, vbOKCancel, "System message") If vResult = vbOK Then bFillList = True End If Else bFillList = True End If If rsArtikel.RecordCount > 1 Then Me.Height = 417.75 Me.pgbProgress.Max = 1 Me.Repaint End If If bFillList Then vResult = Time 'Add all articles found to the list For i = 1 To rsArtikel.RecordCount Set rsArtikelTek = _ dbRBase.OpenRecordset("SELECT * FROM Artikel_Tekening WHERE Artikel = '" & _ rsArtikel("Artikel") & "' ORDER BY TekFormaat, TekVorm")
Tekeningen worden enkel toegevoegd als deze nog niet in de lijst staan. Als we hierop niet controleren krijgen we meerdere resultaten voor hetzelfde artikel. Dit is onoverzichtelijk en overbodig, dus controleren we eerst of een referentie al in de treeview voorkomt. De iconen voor gebruik in de treeview worden hier geselecteerd. Met name de waarde voor 'ExpandedImage' kan niet vanuit de design window in VBA worden ingesteld en moet achteraf gebeuren. Zo ziet de treeview er toch nog "echt" uit. If rsArtikelTek.RecordCount > 0 Then 'One or more drawing references were found, add them to the list rsArtikelTek.MoveLast rsArtikelTek.MoveFirst
42
bFound = False With tvwResu lts 'Check to see if the current article exists in the tree For j = 1 To .Nodes.Count If .Nodes(j).Key = "art" & rsArtikel("Artikel") Then bFound = True .Nodes(j).Expanded = True End If Next j End With 'Add article only if it didn't exist yet If Not bFound Th en With tvwResults .Nodes.Add , , "art" & rsArtikel("Artikel"), _ rcFormatArticle(rsArtikel("Artikel")) & " - " & _ rsArtikel("Omschrijving_ ned"), "folder" .Nodes(tvwResults.Nodes.Count).ExpandedImage = "folder_open" .Nodes(Me.tvwResults.Nodes.Count).Expanded = True End With
De volgende code voegt samengestelde tekeningen toe aan het huidige artikel. Aangezien een referentie bij meer dan één artikel kan staan in dezelfde treeview list, moet een codering worden gekozen die dit toestaat. Anders wordt een fout gegenereerd. 'Add drawings to the treeview For j = 1 To rsArtikelTek.RecordCount rsTekFormaat.Seek "=", rsArtikelTek("TekFormaat") With Me.tvwResults Select Case rsTekFormaat("Extensie") Case "dwg" .Nodes.Add "art" & rsArtikel("Artikel"), tvwChild, _ "art" & rsArtikelTek("SearchID"), rsArtikel(" Artikel") _ & rsArtikelTek("Achtervoegsel") & ".dwg", "drawing" Case "dwf" .Nodes.Add "art" & rsArtikel("Artikel"), tvwChild, _ "art" & rsArtikelTek("SearchID"), rsArtikel("Artikel") _ & rsArtikelTek("Achtervoegsel") & ".dwf", "drawing_dwf" Case "dxf" .N odes.Add "art" & rsArtikel("Artikel"), tvwChild, _ "art" & rsArtikelTek("SearchID"), rsArtikel("Artikel") _ & rsArtikelTek("Achtervoegsel") & ".dxf", "drawing_dxf" Case "jpg" .Nodes.Add "art" & rsArtikel("Artikel"), tvwChild, _ "art" & rsArtikelTek("SearchID"), rsArtikel("Artikel") _ & rsArtikelTek("Achtervoegsel") & ".jpg", "drawing_jpg" Case "png" .Nodes.Add "art" & rsArtikel("Artikel"), tvwChild, _ "art" & rsArtikelTek("Sea rchID"), rsArtikel("Artikel") _ & rsArtikelTek("Achtervoegsel") & ".png", "drawing_png" End Select End With rsArtikelTek.MoveNext Next j 'Add appropriate section drawings to the article's description Set rsProfTek = _ dbRBase.OpenRec ordset("SELECT * FROM ProfTek WHERE Artikel = '" & _ rsArtikel("Artikel") & "' AND KoppelIndex > 0 ORDER BY Tekening") If rsProfTek.RecordCount > 0 Then tvwResults.Nodes.Add "a rt" & rsArtikel("Artikel"), tvwChild, _ "section" & rsArtikel("Artikel"), "Doorsnedetekeningen", _ "folder" tvwResults.Nodes(tvwResults.Nodes.Count).ExpandedImage = _ "folder_open" 'Add all drawings in the table to the treeview
43
For j = 1 To rsProfTek.RecordCount 'rsTeken ing.Seek "=", rsProfTek("Tekening") tvwResults.Nodes.Add "section" & rsArtikel("Artikel"), _ tvwChild, "sec" & rsArtikel("Artikel") & " -" & _ rsProfTek( "Tekening"), rsProfTek("Tekening") & _ ".dwg", "drawing" rsProfTek.MoveNext Next j End If rsProfTek.Close End If End If rsArtikelTek.Close rsArtikel.MoveNext Me.pgbProgress.Value = i / rsArtikel.RecordCount Next i Me.Height = 402 Me.pg bProgress.Value = 0 End If Else If rcArticleNumber(txArticle.Text) = "" Then vResult = MsgBox("That article doesn't exist", vbExclamation, "System message") Else vResult = MsgBox("No drawings were found", vbExclamation, "System message") End If End If 'Close tables and database rsArtikel.Close rsTekFormaat.Close dbRBase.Close wkRBase.Close End Sub
44
6.5 Programmacode routine rcFillSectionForm Deze routine ligt ten grondslag aan de schrijfroutine voor samengestelde tekeningen. Vanuit deze routine wordt de listbox met blokken, gevonden in de tekening, gevuld. Deze routine maakt het mogelijk met een minimum aan handelingen, samengestelde tekeningen te koppelen aan artikelnummers voor latere referentie. Private Sub rcFillSectionForm(ByVal sDrawing As String) 'Generic variables Dim i As Integer, j As Integer Dim bExist As Boolean Dim sArticle As String Dim item As Object Dim vList() As Variant Dim vResult As Variant 'Database variables Dim wkRBase As Workspace Dim dbRBase As Database Dim rsArtikel As Recordset Dim rsProfTek As Recordset Dim rsTekening As Recordset 'Set up connection with the database Set wkRBase = C reateWorkspace("", "admin", "", dbUseJet) Set dbRBase = wkRBase.OpenDatabase(rcRBasePath) 'Open the database Set rsArtikel = dbRBase.OpenRecordset("Artikel") Set rsTekening = dbRBase.OpenRecordset("Tekening") rsTekening.Index = "Primary Key"
Zoek tekeningnummer op in de database via functie "rcDrawingNumber". Deze functie is qua opzet gelijk aan die van de functie "rcArticleNumber". Als een nummer gevonden werd kunnen we de preview vullen met het gekoppelde bestand. We vullen het formulier verder vanuit de database met de tekeninggegevens. 'Fill the form with the required data, if present sDrawing = rcDrawingNumber(txSection.Caption) If sDrawing <> "" Then 'Preview the drawing in the preview pane voloPrevi ew.src = rcDrawingPath(sDrawing & ".dwg") voloPreview.Visible = True rsTekening.Seek "=", txSection.Caption txDescription.Text = rsTekening("Omschrijving_ned") txRemarks.Text = Format(rsTekening("Opmerkingen"), "@") For i = 0 To comboTekType.ListCount - 1 If comboTekType.List(i, 0) = rsTekening("TekType") Then comboTekType.ListIndex = i Next i txSection.Caption = rsTekening("TekNr") 'Fill the listbox Set rsProfTek = dbRBase.OpenRecordset("SELECT * FROM ProfTek WHERE Tekening = '" _ & rsTekening("TekNr") & "' ORDER BY Artikel") If rsProfTek.RecordCount > 0 Then rsProfTek.MoveLast rsProfTek.MoveFirst lsBlockExport.Clear 'vList(0, 0) = "Blok" 'vList(0, 1) = "Artikel" 'vList(0, 2) = "Status" 'vList(0, 3) = "ID" For i = 0 To rsProfTek.RecordCount
- 1
45
With lsBlockExport .AddItem .List(i, 0) = rsProfTek("Artikel") .List(i, 1) = rsProfTek("Artikel") .List(i, 2) = "X" .List(i, 3) = rsProfTek("SearchID" .List(i, 4) = rsProfTek("KoppelIndex") .Selected(i) = False End With rsProfTek.MoveNext Next i End If cmdSave.Enabled = True
)
Else lsBlockExpor t.Clear comboTekType.Enabled = True cmdSave.Enabled = False End If
Controleer de artikelen gevonden in de "Blocks" collectie van de huidige AutoCAD tekening en plaats deze in de listbox "Articles found in drawing". 'Check for article numbers in the drawing. Any article number will be reported. rsArtikel.Index = "PrimaryKey" With lsArticles 'Report blocks from the block definitions For Each item In ThisDrawing.Blocks sArticle = rcArticleNumber (item.Name) If sArticle <> "" Then rsArtikel.Seek "=", sArticle 'Check if the article number exists in the listbox bExist = False For i = 0 To .ListCount - 1 If sArticle = .List(i, 0) Then bExist = True Next i If Not bExist Then .AddItem .List(.ListCount - 1, 0) = sArticle .List(.ListCount - 1, 1) = rsArtikel("Omschrijving_ned") Select Case rsArtikel("Type") Case 0 .List(.ListCount - 1, 2) = "3" Case 100 .List(.ListCount - 1, 2) = "2" Case Else .List(.ListCount - 1, 2) = "1" End Select End If End If Next 'Report elements in the drawing: modelspace For Each item I n ThisDrawing.ModelSpace Select Case item.ObjectName
We gaan hier alle elementen in modelspace doorlopen. Samengestelde tekeningen moeten altijd worden opgebouwd in modelspace. We hoeven paperspace dus niet te controleren. Alle blokken die in modelspace gevonden worden dienen te worden gerapporteerd. Elk blok wat hier gevonden wordt, moet worden geselecteerd in de listbox. Dit zijn waarschijnlijk de artikelen die we willen gaan koppelen in de database. Case "AcDbBlockReference" 'Mark any articles found in the listbox as selected if they are found in 'the drawing sArticle = rcArticleNumber(item.Name) If sArticle <> "" Then rsArtikel.Seek "=", sArticle
46
For i = 0 To .ListCount - 1 If .List(i, 0) = sArticle Then .Selected(i) = True For j = 0 To lsBlockExport.ListCount - 1 If .List(i, 0) = lsBlockExport.List(j, 1) And .List(i, 2) = _ lsBlockExport.List(j, 4) Then .Selected(i) = False End If Next j End If Next i End If
Om het gemakkelijker te maken artikelen waarvoor geen blok in de tekening is opgenomen te kunnen koppelen aan de tekening, nemen we een optie op om tekst die in de tekening is geplaatst te controleren op artikelnummer. We kunnen nu in de tekening met het AutoCAD commando DText een referentie plaatsen naar een artikel. Case "AcDbText" sArticle = rcArticleNumber(item.TextString) If sA rticle <> "" Then rsArtikel.Seek "=", sArticle 'Check if the article number exists in the listbox bExist = False For i = 0 To .ListCount - 1 If .List(i, 0) = sArticle Then bExist = True Next i If Not bExist Then .AddItem .List(.ListCount - 1, 0) = sArticle .List(.ListCount - 1, 1) = rsArtikel("Omschrijving_ned") Select Case rsArtikel("Type") Case 0 .List(.ListCount - 1, 2) = "3" Case 100 .List(.ListCount - 1, 2) = "2" Case Else .List(.ListCount - 1, 2) = "1" End Select End If End If End Select Next End With End Sub
47
6.6 Programmacode routine rcSaveSectionDrawing Deze routine dient om een samengestelde tekening op te slaan in de bibliotheek en alle relevante gegevens in de database te verwerken. Private Sub rcSaveSectionDrawing() 'Generic variabl es Dim i As Integer Dim obj As Variant Dim vResult As Variant Dim bSelected As Boolean 'Database variables Dim wkRBase As Workspace Dim dbRBase As Database Dim rsArtikel As Recordset Dim rsProfTek As Recordset D im rsSearchProf As Recordset Dim rsSeries As Recordset Dim rsDrawing As Recordset Dim rsTekType As Recordset Dim rsDocumentatie As Recordset Dim rsDrawingSeries As Recordset 'Set up connection with the database Set wkRBase = CreateWorkspace("", "admin", "", dbUseJet) Set dbRBase = wkRBase.OpenDatabase(rcRBasePath) 'Open the database Set rsArtikel = dbRBase.OpenRecordset("Artikel") Set rsProfTek = dbRBase.OpenRecordset("ProfTek") Set rsDrawing = dbRBase.Op enRecordset("Tekening") Set rsTekType = dbRBase.OpenRecordset("TekType") Set rsDocumentatie = dbRBase.OpenRecordset("Documentatie") Set rsDrawingSeries = dbRBase.OpenRecordset("Tek_Serie") rsArtikel.Index = "PrimaryKey" rsDrawing.I ndex = "PrimaryKey" rsTekType.Index = "PrimaryKey" rsDocumentatie.Index = "PrimaryKey"
Controle of de tekening al in de database is opgenomen. Als de tekening nog niet in de tabel "Tekening" bestaat moet deze worden toegevoegd. We schrijven alle gegevens die betrekking hebben op de nieuwe tekening in de database: naam, omschrijving, opmerkingen, huidige datum, status (actueel), en welke formaten worden opgeslagen. 'Look up the drawing in the database rsDrawing.Seek "=", txSection.Capti
on
'If the drawing doesn't yet exist, add it to the list If rsDrawing.NoMatch Then rsDrawing.AddNew rsDrawing("TekNr") = txSection.Caption rsDrawing("Omschrijving_ned") = txDescription.Text rsDrawing("Tekdat") = Format(Date, "dd -mmm -yy") rsDrawing("TekType") = comboTekType.Value rsDrawing("Status") = 5000 rsDrawing("Opmerkingen") = txRemarks.Text rsDrawing("DWG") = True rsDrawing("DXF") = True rsDrawing("DWF") = Tru e rsDrawing("PNG") = True rsDrawing("Index") = True rsDrawing.Update
48
Nu gaan we controleren of de tekening al aan een Reynaers serie is gekoppeld. Dit doen we door de waarde die we uit de listview met serieinformatie halen op te zoeken in de database. In principe wordt een serie gekoppeld op documentatiegroep. Elke documentatie heeft een uniek nummer, hetgeen gebruikt wordt in de eerste twee cijfers van het tekeningnummer. Deze code is de primaire serie voor de aangegeven tekening. 'Run query on series Set rsSeries = _ dbRBase.OpenRecordset("SELECT DISTINCT Serie_SubSerie.SearchID" _ & " FROM Documentatie, Documentatie_Serie, Serie_SubSerie" _ & " WHERE Documentatie.GroepID = Docum entatie_Serie.DocGroep" _ & " AND Documentatie_Serie.SubSerieID = Serie_SubSerie.SearchID" _ & " AND Serie_SubSerie.Standaard = TRUE AND Documentatie.Chapter_prefix = '" _ & Left(txSection.Caption, 2) & "'") If r sSeries.RecordCount > 0 Then rsSeries.MoveLast rsSeries.MoveFirst For i = 1 To rsSeries.RecordCount rsDrawingSeries.AddNew rsDrawingSeries("Tekening") = txSection.Caption rsDrawingSeries("SubSerieID") = rsSeries("SearchID") rsDrawingSeries.Update rsSeries.MoveNext Next i End If Else
Als de tekening al bestaat in de database, passen we de omschrijving en de opmerkingen aan. Ook wordt de datum aangepast naar de huidige datum en worden de velden voor de verschillende bestandsformaten ingevuld. rsDrawing.Edit rsDrawing("Omschrijving_ned") = txDescription.Text rsDrawing( "Opmerkingen") = txRemarks.Text rsDrawing("Tekdat") = Format(Date, "dd -mmm -yy") rsDrawing("DWG") = True rsDrawing("DXF") = True rsDrawing("DWF") = True rsDrawing("PNG") = True rsDrawing.Update End If
Alle artikelnummers die in de listbox voor gekoppelde artikelen staan moeten worden weggeschreven in de database. Hiervoor dient de tabel "ProfTek". Deze tabel koppelt artikelnummers aan samengestelde tekeningnummers. Door hier selecties op te draaien kan een lijst van alle tekeningen voor een bepaald artikel worden gegenereerd. 'Add items to be exported to the 'ProfTek' table in the database For i = 0 To lsBlockExport.ListCount - 1 With lsBlockExport If .Selected(i) Then
Eerst controleren we of de koppeling tussen artikel en tekening al bestaat. Als dit niet zo is, dan geeft de aangeroepen recordset 0 elementen op en voegen we de koppeling toe aan de tabel. 'Check if the article is already connected to the drawing Set rsSearchProf = _ dbRBase.OpenRecordset("SELECT * FROM ProfTek WHERE Artikel = '" _ & .List(i, 1) & "' AND Tekening = '" & txSection.Caption & "'") If rsSearchProf .RecordCount = 0 Then rsProfTek.AddNew rsProfTek("Artikel") = .List(i, 1) rsProfTek("Tekening") = txSection.Caption rsProfTek("KoppelIndex") = .List(i, 4) r sProfTek.Update
49
End If End If End With Next i
Hierin creëren we met het AutoCAD dictionary object een aantal gegevens die we onzichtbaar in de tekening kunnen opslaan. Zo kan een Reynaers tekening worden geïdentificeerd door RCAD, zodat het programma "weet" dat de tekening via RCAD is gemaakt. 'Create dictionary object Set rcDict = ThisDrawing.Dictionaries.Add("RCAD") Set rcXRecord = rcDict.AddXRecord("RCADData") ReDim rcXDataType(0 To 2) As Integer ReDim rcXData(0 To 2) As Variant 'Basic page data rcXDataType(0) = 1: rcXData(0) = "RCAD" rcXDataType(1) = 1: rcXData(1) = txSection.Caption If Not rsDrawing.NoMatch Then rcXDataType(2) = 1: rcXData(2) = rsDrawing("TekType Else rcXDataType(2) = 1: rcXData(2) = comboTekType.Value End If rcXRecord.SetXRecordData rcXDataType, rcXData
")
Tot slot slaan we de tekening op in de formaten die we voor informatieverstrekking aan klanten nodig hebben: DWG, DXF, DWF en PNG. 'Write DWF, PNG and DXF formats Application.ActiveDocument.Plot.PlotToFile rcDrawingPath(txSection.Caption, _ dwfFile, , , rcNew), rcRCADPath & "plotters \" & rcPlotDWF Application.ActiveDocument.Plot.PlotToFile rcDrawingPa th(txSection.Caption, _ pngFile, , , rcNew), rcRCADPath & "plotters \" & rcPlotPNG ThisDrawing.SaveAs rcCADPath & "dxf \" & comboTekType.Column(2) & " \" & _ txSection.Caption & ".dxf", rcDXFVersion ThisDrawing.SaveAs rcCADPath & "dwg \" & comboTekType.Column(2) & " \" & _ txSection.Caption & ".dwg", acDWGVersion 'Close the recordset and database rsDrawing.Close dbRBase.Close wkRBase.Close Unload Me End End Sub
50
Lijst van afbeeldingen Afbeelding 1: Reynaers in europa .............................................................................................. 5 Afbeelding 2: Organisatiestructuur Reynaers B.V....................................................................... 6 Afbeelding 3: Profieltekening...................................................................................................... 8 Afbeelding 4: Accessoirestekeningen......................................................................................... 9 Afbeelding 5: Samengestelde tekening ...................................................................................... 9 Afbeelding 6: Meer dan 50.000 tekeningen ...............................................................................14 Afbeelding 7: Formulier "fmFind"...............................................................................................21 Afbeelding 8: Zoekresultaten voor artikeltekeningen .................................................................23 Afbeelding 9: Stroomschema zoekroutine .................................................................................24 Afbeelding 10: Formulier "fmWrite" ...........................................................................................25 Afbeelding 11: Resultaten samengestelde tekening ..................................................................27
Lijst van tabellen Tabel 1-1: Directorystructuur CAD-bibliotheek ..........................................................................10 Tabel 5-1: Lijst van componenten .............................................................................................28
51