Page 1

The GDL Cookbook Version 3 Teach yourself GDL by the Cookbook method & ‘ArchiCAD Tips and Tricks’

by David Nicholson-Cole and guests

The GDL Cookbook 3 The SOURCE of all that is good in GDL • and • ArchiCAD Tips and Tricks

by David Nicholson-Cole with guest contributions

The GDL Cookbook 3 The GDL Cookbook 3, the SOURCE of all that is good in GDL, is published by Marmalade Graphics, Nottingham ©1998, 1999, 2000 Marmalade Graphics, 15 Elmtree Ave, West Bridgford, Nottingham NG2 7JU, England International Tel +44-115-945-5077 : Fax +44-115-945-5121: UK Tel 0115-945-5077 : Fax 0115-945-5121: email: / /

Cookbook Website> with additional material on The GDL Cookbook is distributed through Graphisoft and ArchiCAD dealers, through the Internet and by word of mouth. • ISBN 0 9535216 0 5 • First published March 98; Version 2.0 June 1999; Version 2.1 February 2000; Version 3.0 December 2000 This edition: Cookbook 3.01 May 2001 Text printed by Alpha Graphics, Angel Row, Nottingham, England, covers by Adlard Print. Set in Britannica, Garamond and Frutiger, using Adobe Pagemaker on a Macintosh G3 The GDL Cookbook is available in chunks, as a series of web based supplements, Cookbook X-Tracts. Please look at the Cookbook website for further information. The GDL Cookbook was largely written by David Nicholson-Cole GDLA, but for this edition, he has brought in contributions from expert friends. This team effort has added a richer variety and a visibly elevated level of expertise to the content. In particular, Dwight Atkinson MAIBC of Vancouver, Canada has been most helpful as a technical proofreader, and Laurent Godel GDLA has made a substantial contribution..

"The sea is dangerous and its storms terrible, but these obstacles have never been sufficient reason to remain ashore... Unlike the mediocre, intrepid spirits seek victory over those things that seem impossible... it is with an iron will that they embark on the most daring of all endeavours... to meet the shadowy future without fear and conquer the unknown." Ferdinand Magellan, Explorer (c.1520)


LL rights reserved. Printed in the United Kingdom of Great Britain. No part of this book, or the software with it, may be copied or reproduced in any form, or by any means, or stored in a database or retrieval system, without prior permission of the publisher, except in the case of brief quotations embodied in critical articles or reviews. Making copies of any part of this book for any purpose other than your own use is a violation of UK copyright laws.


HIS book and the software included on disk is sold as is, without warranty of any kind, either expressed or implied. While every precaution has been taken in the preparation of this book, the Author and the Publisher assume no responsibility for errors or omissions. Neither is any liability accepted for damages resulting from the use of the information or instructions contained herein. All terms used in this book that are known to be trademarks have been capitalised.

Key to Illustrations: Front cover and interleaves: Staircase at 9 Sloane St by Eva Jiricna, model by Cathy Wood (University of Nottingham 1998), one of DNC’s students.

Front cover and interleaves: Design idea for Railway station, Stuart Buckenham, Stuart Winter, Andy Hitchcock, David Nicholson-Cole.

Front cover: The Tower crane, July 2000, by David Nicholson-Cole

Inside front cover: Pinero structure for a Railway Station, by David Nicholson-Cole.

The GDL Cookbook 3

What is GDL?


EOMETRIC Description Language (GDL) is ArchiCAD’s built in scripting language for object making.

GDL scripting in a nutshell...

Who is GDL really useful for?


DL uses a variety of written commands like BLOCK, EXTRUDE and TUBE. Combining these in GDL, you can built up 2D and 3D objects which can be used in ArchiCAD as Library Parts. • Because GDL includes Cylinders, Cones, Prisms, Tubes, Surfaces and much more, you can make Objects that cannot be made with wall+slab tools. • Because you can use variables like X and Y, you can make the objects change their parameters – they can be Parametric. • Because you can write IF Statements, you can make the objects obey rules – they can be Smart. • Because you can build in Repetitive Loops, you can go beyond object making – and make Tools. • Because you can rotate and move elements, you can make Mechanisms.


What can you do with GDL?

Could you learn GDL?


ITH GDL, you can build structural elements that look right for their purpose, elements of detail that make a building model look authentic, furniture that is smart and elegant, lights that let you turn them on and tune their luminance, windows that can open or swivel, doors that can change their panel styles, stairs that offer a choice of landing and handrail styles, picture objects on which you can plaster building elevations and thus build whole street scenes, 2D drawing tools that can enhance our productivity – and much more besides. • Let’s learn something of this power!


LL major CAD packages have an internal scripting language. It is most fortunate for ArchiCAD users that GDL grew out of BASIC, the most popular and widely taught programming language of the eighties, thus making it accessible to all users, not just to people with a degree in Computer Science. With a few hours of exploration into GDL, the total beginner can make something surprisingly useful, indeed powerful. For the more experienced user, GDL has a depth that never ceases to turn up interesting new techniques and possibilities. • Now that you have this book you have the key!

Who supports the GDL user?

Where is GDL going to?



HE worldwide culture of GDL is assisted by Graphisoft itself by providing a reliable product in the stable and growing environment of ArchiCAD; by the efforts of organisations like the GDL Alliance (a network of GDL developers supporting the culture of GDL and promoting the professionalisation of GDL); GDL Technology Inc (created 2001 to promote GDL to furniture and component manufacturers); Objects on Line, and (Internet storefronts enabling download of objects); a number of enlightened ArchiCAD dealers who are willing to foster the wider use of GDL; the users of ArchiCADTalk (Internet conference on all ArchiCAD matters) and of GDLTalk (a similar Internet conference on GDL matters); by the OMWAC beginners book (Object Making with ArchiCAD); by the GDL Cookbook; and finally by Graphisoft’s own Technical Standards publication.

HE normal ArchiCAD user can use GDL to enhance the quality of their models, improve their productivity, and to further their personal skills base. The component manufacturer can see GDL as a way of providing components and tools that will encourage ArchiCAD users to specify their products. The engineer can see GDL as a means of providing building components that can display levels of intelligence and adaptability. The would-be GDL developer can find enough in GDL to grasp career enhancing opportunities. The university student can find a way to extend all that maths learned at college and add value to their architectural portfolio. The ArchiCAD reseller has the means to prove to potential customers that ArchiCAD carries a significant power advantage.

DL is now becoming a major language of 3D form. Graphisoft’s Object Initiative is a drive to promote GDL technology. GDL objects can be used in AutoCAD as well as ArchiCAD, and manufacturers are being encouraged to think of GDL as a new way to distribute CAD images of their products. DXF may be universal, but it’s dumb and obese, and manufacturers’ product ranges need to be converted to GDL. Until 2000, GDL was largely enjoyed by ‘inspired amateurs’, architects who dabbled with GDL to complete their projects on time and elegantly; for that, GDL only had to be good enough for the day. Now, a more serious approach needs to be taken. GDL could be taken up by a new breed of of technical specialists who work to a high standard. There is a huge amount of work available in the next few years for people prepared to adapt all these libraries to GDL. Go for it!

The GDL Cookbook 3

The GDL Cookbook 3 The SOURCE of all that is good in GDL THE GDL Cookbook is a collection of models which have been produced to help teach GDL. Each one is accompanied by explanatory text and images. Sections on Theory and Technique fill out the space between. The CD also contains most of the examples, and a few other files which contribute to the learning experience of GDL. The models are sequenced to give a ‘Cookbook’ style of progressive learning. GDL can be fun, as well as being useful in your career.

The Cookbook Idea

Difficulty Level? Try OMWAC!



HE original GDL manual is good but it has too few examples and explanations. It is dry and humourless. This ‘Cookbook’ approach to learning is designed to change what seems like a daunting task into something enjoyable and useful. This book is not intended to rewrite the manual, nor to repeat the GDL textbook from Graphisoft, published in 1997. All of these have their place and are useful. Always have the GDL reference manual handy while you work, and please use the ‘Helpmenus’ when in ArchiCAD. The metaphor of ‘Cookbook’ suggests that you will learn some GDL in a few days. This is quite true if you work through the starting exercises. This is also true the first time you pick up a guitar and have a few basic lessons. However, you will require much longer than that, and need to try some real projects, to acquire proficiency to the level of a GDL Voyager.

Smart Parametric Models


OU are truly privileged. You are the only members of the CAD community who have the ability to build PARAMETRIC objects without needing a degree in Computer Science. Quite simply, ‘Parametric’ means that you can change the parameters of an object. With GDL, it also means that the object can be ‘smart’ – change its own characteristics according to rules or calculations. Thus it can display a level of ‘artificial intelligence’. This is the power of GDL! In other CAD software, if you stretch an object, it will stretch, but the elements of the object will be distorted proportionally. Whereas, with a parametrically built window, handrail, stair or structural truss tool, it can be written to recalculate the spacing of members, to resize members if necessary, correct user’s errors, offer the user intelligent choices through pop-down menus in the object, and change the way it looks at different scales or distances. All these techniques are covered in the GDL Cookbook.

Tips and Tricks


HE Tips and Tricks sections of this book are not just about GDL. They are designed to make your whole use of ArchiCAD more fulfilling and productive. Many of them are contributed by experts from around the world. Please Enjoy!

HIS book is quite ‘pacey’. You need to move fast and determinedly through it. The beginner’s pages do not last long before you are into more challenging territory. If you find the pace too hot, do not worry. Put the book on the shelf and spend some time with the junior book on GDL, Object Making with ArchiCAD (hereafter called ‘OMWAC’), written by the same author and published by Graphisoft, and targeted at GDL beginners. Just as the Cookbook is designed to make the GDL Reference manual easier, the OMWAC is designed to make the GDL Cookbook easier. It will bring you safely into the foothills of GDL. After that you will find the GDL Cookbook easier to work with.

This edition


HE design environment is constantly changing – no sooner had the original GDL Cookbook settled down to a level of completion in 1998 than I was having to adjust to ArchiCAD 6.0 at the end of 1998. At the end of 1999, ArchiCAD 6.5 appeared! As each fresh release of ArchiCAD is expected, the Cookbook has to adapt. This is why I operate a generous upgrade policy. Whenever you find that ArchiCAD or the GDL Cookbook has moved on a step or two, you can have a replacement Cookbook for a concessionary price, only from the publisher. How does this edition vary from the previous? The Cookbook has always been evolutionary. At any point in time, the Cookbook of the time has always been adequate to kick start your GDL knowledge. This edition is built on the 2.10 edition of Feb 2000. CB2 had become congested with my attempts to keep the airmail weight as low as possible and to keep single topics to exact numbers of pages. Fonts were too small, illustrations overlapped in places, and any chance of translation was out as just about every other language requires more space than English. Graphisoft recognised the Cookbook 2 as a target solution in the centre of the GDL education process and commissioned OMWAC in April 2000. They published their own document at the professional level. Now, for the Cookbook, it’s time to blow out the pagination with fresh white space and larger fonts, to make it more of a compendium at the centre of GDL. Some rewriting and additions are inevitably provided, bringing it up to the title of Cookbook 3. I hope you agree that it deserves that title.

The GDL Cookbook 3

Reasons why you need not learn GDL • You can already make library objects using the Wall, Slab and Roof tools. • You are contented to manage with the existing ArchiCAD library. • You can purchase CDs of more objects. • You can pay a bureau to make 3D objects when the need arises. • A lot of the work you do is 2D and doesn't need 3D modelling.

• It looks difficult – the GDL manual makes you shudder, just looking at it. • You think you can't remember trigonometry or geometry, and you think you cannot program. • None of the objects you make need to be 'smart' or elegant, or be repeated (surely not?)

Reasons why you should learn GDL • You can make insanely great things that, for interest and complexity, go far beyond library objects made with wall, roof and slab tools. • You can make ‘tools’ – such as a joist tool, louvre tool or a handrail tool – that increase your productivity. • You can make parametric models – i.e. an object that offers you a dialog box with the means of changing its height, diameter, colour, frequency, style, etc. • It is very economical in disk space – GDL models only occupy the disk size of a script plus a small header and footer. • You speed up rendering time; objects can be written with clean coding, unlike the dirty code produced by DXF or library objects made with wall, roof and slab, which needlessly calculate forms to one millionth of a metre accuracy. • You can have really cool features like modestly intelligent objects that complain if you enter wrong parameters; that offer you options in the language of your choice; offer you popdown menus to assist you with choosing parameters; dynamically turn to face the camera; can change colour or shape as their po-

sition in the model, storey, or camera location changes. They can even consider whether to bother drawing themselves or not. • You can do a useful clean-up job on objects created with wall, roof and slab tools, if you know a bit of GDL. • You can increase or decrease the level of detail in a model by being firmly in control of the number of polygons. • It’s fun, and easy once you get the hang of it. It is enjoyable to use simple mathematics and programming skills to see 3D forms popping out of the screen in front of your eyes! • With GDL, you have the opportunity to develop a niche skill that will put you ahead of others in your field, and could open the way to new career opportunities now that Graphisoft have ‘liberated’ GDL by making GDL objects usable in other CAD environments.

Clearly, the reasons to use GDL far outnumber the reasons not to (:-)

GDL is an investment


often hear from people who have bought the GDL Cookbook that they “haven’t had time to get going with it yet”. This is a matter of organising your time, taking a long term view. The time you spend now is an investment in your future; the time you spend on an object could also ensure that the object has a great future. Ask yourself if the object you want to make is to be used more than once, if it could be useful in other projects. You might be the one person in the office making objects for other people, and therefore you need to make the object usable by others. If you make it parametric and smart, it might take you longer to make an object that could more quickly be made with

the slab, wall and roof tools. But if the object has versatility and can be applied to many more projects for ever after, the time taken to make the object well is a good investment and your users will be grateful for the effort. Objects made with the Toolbox are no longer editable if the original floor plan file that made them has been lost. A piece of GDL that is well written can be extended and made more powerful when your own knowledge of GDL improves or when a new edition of ArchiCAD offers more features. A well written object could be taken on by someone else in the office, years after you have left, and improved to take advantage of the features in a future version of ArchiCAD.

The GDL Cookbook 3

You’ve read the book, now tell me what you think: • I found the GDL Cookbook an excellent support for GDL object generation in ArchiCAD. The style of your book is really refreshing and informative. Its personal touch helps in learning GDL in an entertaining way. I fully recommend the GDL Cookbook to any ArchiCAD user who wants to access the full power of object parametrics in their designs. Andras Haidekker, CEO GDL Technology Inc, Dec’98 • The more I write, the more I’m addicted to it – GDL is so great! Again, I cannot thankyou enough for teaching us GDL. Chee Horng Chang, architect, Leeds • Today I actually created an object with embedded text scaling related to drawing scale for a client. Paid off the Cookbook in just one exercise. Thankyou. Also, gratitude for the squiffle line idea. Fabulous! Dwight Atkinson, Canada • I LOVE THE COOKBOOK!!!! I think you've done a great job! Greg Richmond, Dallas • Great book, v. exciting because it at least gets you doing things! So far, can’t put it down – has made me keen to learn more – Kevin Hayes, Brisbane, Australia • I’m wading through the Cookbook and am (oh-so) slowly getting it for the first time in ten years of using ArchiCAD. Jack Suben, California, USA. • I am the no. 1 fan of your Cookbook and your organisation. Majid Ahari, structural engineer • I have had a much better chance to study the Cookbook... its a wonderful work. I regret not having the book in 94 when I started teaching myself ArchiCAD it would saved me a lot of headaches and money. Even though I have done a lot of GDL development, you have clearly done a lot more; there is very little you haven't covered. I have tended to favour a smaller subset of the 2d and 3d GDL statements and not delved too deeply into the full range of GDL possibilities. Mike Carbone - Australia • The best thing I've done apart from buying AC has been your CB's and the establishment of "My_Library". Rod Jurich & Associates, Australia • Just a note of appreciation for your cookbook exercises: I’ve been working my way through them recently, with a dawning sense of the potential of parametric GDL scripting... And I’m beginning to change sides on the great graphic vs scripted debate, having spent several unhappy weeks trying to see the point of Visual GDL.... David Collins • When I think about it, meeting you is one of the best thing in my university life, you taught me something that could shift my whole career. Somehow, there is a merging between architecture, computer programming and database management. Alfred Man • Thank you very much for the GDL Cookbook. You produced a very thorough and readable piece of work. Congratulations! Willem Langelaan, author of MasterLibrary • I was a little disappointed with ArchiCAD until I stumbled into its 'hidden garden' - GDL. I now realise that, middle aged or no, drawing things is old hat. I have to learn to program them. William Henderson • Thank you, thank you! Your GDL Cookbook is wonderful. Too many ArchiCAD users deprive themselves of the rich rewards available through the use of this script. On the average, end users find the GDL manuals too daunting and never progress further then perhaps using objects made in

the 3D-view window if even that. Your rational, clear and abundantly documented examples help the neophyte and others in demystifying this very powerful language. Jacques Couture, ASYM technologies, the first reseller of ArchiCAD in the United States • I got your book last month. Congratulations, it is great. I never had time to update my book, but you do a much better job of evangelising GDL.Pal Szabo, author of The Introductory Guide to GDL • I am reading your book and cannot express my feeling. Everything in this book is so interesting, innovating and intelligent. This book is more than GDL. This book is more than a book. It’s a way of thinking, it’s a way of life! Dusko Maksimovich, Aalto Skola Racnara • The cookbook is one of the best purchases this year. It's a real eye-opener: it gives me the anwers to most of my questions about Archicad and GDL and it also provides me some solutions for problems I didn't even know existed before. I hope I find the time to go through it all. Thank you for your excellent work and helping making GDL easier. Christian Cerliani, Zurich • Without a doubt, the GDL Cookbook is the best manual I've seen written on GDL. The Cookbook is so thoroughly indexed and documented that I'm finding it has not been difficult to quickly find answers to my questions. The Cookbook, in combination with the GDL training I received, has also made Graphisoft's GDL Reference Manual much easier to understand. You have successfully demonstrated that there are no limits to what can be done in ArchiCAD if one applies the skills & techniques that you teach in your training and in the Cookbook. Chris Stringer USA • You very effectively got me over the hump of GDL and I am very appreciative of your efforts. Robert Davis, Texas • The company I work for has been using ArchiCAD for several years and not yet really got into it's wonderful power and flexibility with the GDL side of it. We bought GDL Cookbook earlier this year and a couple of us 'drafties' have read thru and tried to complete a number of your exercises It is full of interesting tips and tricks that have helped us enormously. Trevor Wright Summit Projects, Perth, WA • I’ve been working with GDL for a while until I discovered your GDL-Cookbook – and it was amazing! Every problem I’ve had could be solved with it. Marc Assman David, I'm very happy. Your book is this year’s ‘Best Buy’ product. Every day I produce 1 new full parametric object. Yesterday, tube rail, and today, Chimney hole, for inserting in to the wall via Window tool. Branislav Drgon, Slovakia ArchiCAD is very powerful. The capabilities of GDL are incredible (my hat is off to DNC who inspired me to push my knowledge). I am an ArchiCAD believer. James Huether I'm in GDL-Heaven! I have a GDL Cookbook now in my hands and started ‘eating’ it bit by bit! I was very pleased to realize, that I was doing almost all of the basics you recommended in the right way. In the next days and weeks I will oversee my existing objects for improvements, especially the bits which ‘cooked’ my brain cells really hot! What I see has opened a new universe to me and I'm optimistic to be able to reflect the professional education of your book in my next GDL projects! Many thanks for writing this book from here and now. Karl Heinz Pfefferer

The GDL Cookbook 3

Contents: GDL Discovery Introducing GDL ...................................................................................................................... 1 So, you think you can’t program.............................................................................................. 2 How do you make an Object? .................................................................................................. 3 First Look at GDL ...................................................................................................................... 4 Working in 3D space: 3D Cursor ............................................................................................. 5 Your first 3D Elements.............................................................................................................. 6 3D & 2D Cursor Movement ...................................................................................................... 7 Your first object ... a very simple Chair .................................................................................... 9 Your First 2D Elements ........................................................................................................... 10 Curvature Control ................................................................................................................... 11 2D script for the very simple chair ......................................................................................... 11 More 3D Commands .............................................................................................................. 12 END and Line numbering ...................................................................................................... 12 The Good Chair ...................................................................................................................... 13 Tubular Handrail .................................................................................................................... 14 Structured Programming? ....................................................................................................... 16 These need thinking about... ................................................................................................. 17 PEN ......................................................................................................................................... 17 The ‘Subroutine’ ..................................................................................................................... 18 Converting a script into subroutines ...................................................................................... 19 IF... THEN... ELSE... ENDIF .................................................................................................... 20 BAD Chair example ................................................................................................................ 21 Steps in 2D – Dimension Tool ............................................................................................... 22 PRINT ...................................................................................................................................... 22 Tubular Steel Chair ................................................................................................................. 23 The wickedness of GOTO ..................................................................................................... 25 FOR... NEXT Loops, The inexhaustible workhorse of GDL .................................................. 26 Stretchy Beam Tool ................................................................................................................ 27 Other types of Loop ............................................................................................................... 27 Stretchy Joist Tool ................................................................................................................... 28 Domino House: Loops ........................................................................................................... 30 More 3D Commands – Prisms ................................................................................................ 32 Car Park Barrier ...................................................................................................................... 33 Modify Library object ............................................................................................................. 35 Bits of Syntax .......................................................................................................................... 38 SHADOW, MODEL ................................................................................................................. 38 More about GDL 2D Commands ........................................................................................... 39 POLY2, POLY2_ ...................................................................................................................... 40 More 3D – Drilling Holes in Prisms ....................................................................................... 40 Global Variables ..................................................................................................................... 41 Globals in Action .................................................................................................................... 43 Value Lists ............................................................................................................................... 43 Attribute Definitions ............................................................................................................... 44 Status and Masking values ..................................................................................................... 45 Polylines ................................................................................................................................. 46 Special mask/status values ..................................................................................................... 46 zzyzx? ...................................................................................................................................... 46 Try Polylines yourself! ............................................................................................................ 47 Curvy 3D commands – bPRISM_, REVOLVE! ........................................................................ 48 Fire Extinguisher .................................................................................................................... 49 Simple Sash Window .............................................................................................................. 50 Simple Curvy Window ........................................................................................................... 52 Maths Operators ..................................................................................................................... 53

The GDL Cookbook 3

Properties – keep it simple! .................................................................................................... 54 Bocaccio Chair – Prism masking ............................................................................................ 55 Lattice Truss ............................................................................................................................ 56 Lattice Portal – using Lattice Truss ......................................................................................... 58 Raised Computer Flooring Tool ............................................................................................. 59 Louvre Sunbreaker ................................................................................................................. 61 Comment, Preview and Labels .............................................................................................. 62 Planar 3D Elements ................................................................................................................ 63 More 3D Elements – SLAB, SLAB_, cSLAB_........................................................................... 64 Standard Lamp ........................................................................................................................ 65 Picture Objects - Alpha channels ........................................................................................... 66 Cutplane/Cutend .................................................................................................................... 69 Tapering tube – with cutplane ............................................................................................... 70 The 6.5 User Interface – part 1 ............................................................................................... 71 Compare ArchiCAD 6.5 .......................................................................................................... 72 The Magic of ROT – How to rotate objects in plan ............................................................... 73 CUTPOLY, CUTSHAPE and WALLHOLE ................................................................................ 73 CircleGrid – 2D ....................................................................................................................... 74 Location-aware Capability...................................................................................................... 75 People – outlines which face camera .................................................................................... 76 Dwight’s Binary Hacker ......................................................................................................... 77 Swivel Chair ............................................................................................................................ 79 TUBE ....................................................................................................................................... 81 General Advice and warnings, all in one page ..................................................................... 82 Rules of good conduct and safe passage in GDL .................................................................. 83 Quality Control ....................................................................................................................... 84 GDL Case Studies ................................................................................................................... 85 GDL Cookbook : Questions to ask yourself .......................................................................... 87 Appendix: True Azimuth finding and the IFCo chair ............................................................ 88

Discovery: Tips and Tricks

Long or Short Global names? ........................... 42 Use the GDL Manual! ......................................... 5 2D Crosshairs.................................................... 45 Introduction to Tips and Tricks ............................ 5 Object Naming.................................................. 47 A Note on Spelling .............................................. 8 Golden Rules for making Windows (and Doors) 50 DEL TOP or DEL NTR? ......................................... 8 Rendering ......................................................... 62 Typograpical note ............................................... 8 URL in the Comment field ................................. 63 Help files + Documentation folder .................... 14 See your cursor!................................................ 64 Advice Corner for GDL newbies ........................ 15 Rendering picture objects ................................. 68 Comma confusion? ........................................... 17 Shadows in section/elevation ........................... 74 Golden Rules for Subroutines! .......................... 18 ROT2 and DWG export ..................................... 74 Building Signage: picture into the project ......... 20 General Advice and warnings, all in one page .. 82 Multiply, don’t Divide! ...................................... 25 Libraries .......................................................... 82 LOOP Counter name ......................................... 27 Building the Model, Rendering ...................... 82 Hot Tip for rapid 2D Scripting ........................... 29 Making Library Objects ................................... 82 Ghost Storey to print out? ................................ 30 Rules of good conduct and safe passage in GDL83 Typographical format for all PRISMs ................. 33 Philosophy, Structure .................................... 83 What makes autoscripted objects stretchy? ...... 34 Typography and Layout, Maths ..................... 83 Instant GDL! ..................................................... 36 Development of the Script .............................. 83 Analysing and Extending the 3D Script ............. 37 Good scripting practice ................................... 84 Steal this routine............................................... 37 User Interface ................................................. 84 The Golden Rule: use the Origin ....................... 37 Quality Control ................................................. 84 Join a User Group – or make one! .................... 38 2D scripting ...................................................... 84 Advice on 2D Scripting ..................................... 39 GDL Case Studies.............................................. 85 Hotspots make Stretchy Objects! ...................... 39 Monitor and Card questions ............................. 86 Are your HotSpots Stretchy & Squeezy? ........... 39 Light through walls ........................................... 86 Cursor control in 2D scripting ........................... 40 Modules – another type of ‘object’ ................... 86

The GDL Cookbook 3

Contents: GDL Voyager Voyager Task list ....................................................................................................................... 1 Some Useful guidelines ............................................................................................................ 1 Tips and Tricks 10 page special ............................................................................................... 7 Professional Standards in GDL ............................................................................................... 17 GDL Syntax – PUT, GET & NSP ............................................................................................. 18 Advanced 3D Commands ...................................................................................................... 22 TUBE ....................................................................................................................................... 22 TUBEA .................................................................................................................................... 23 MESH ...................................................................................................................................... 23 COONS ................................................................................................................................... 24 MASS ....................................................................................................................................... 25 RULED, SWEEP, PYRAMID .................................................................................................... 26 EXTRUDE ............................................................................................................................... 27 Polylines explained fully ........................................................................................................ 28 Advanced 2D – FRAGMENT2 ................................................................................................ 31 Fragment Tester ...................................................................................................................... 32 Master Scripts .......................................................................................................................... 33 POLY2_A, POLY2_B, SPLINE2 ............................................................................................... 33 Modifying Parameters – 2D Car ............................................................................................. 34 Input / Output ........................................................................................................................ 35 Arrays ...................................................................................................................................... 36 Arrays in action ....................................................................................................................... 37 GDL Macros ............................................................................................................................ 38 Maths Primer ........................................................................................................................... 39 The Binary System – for Voyagers ......................................................................................... 43 Obscure Commands – ARMC, ARME ..................................................................................... 44 Ridge & Hiptool ...................................................................................................................... 45 AngleRod – Useful stretchy tool object with TUBE ............................................................... 45 Stair – Parametric, with handrails........................................................................................... 47 Theatre in the Round Seating ................................................................................................. 49 Spiral Staircase ........................................................................................................................ 52 The Secrets of Labels – you can make your own graphic label ............................................ 53 Label Arrays – show position ................................................................................................. 55 3D GDL –Building Elements – cWALL, bWALL ...................................................................... 56 SPECIAL PRISMs ..................................................................................................................... 56 LIGHT ..................................................................................................................................... 57 More Cutting ........................................................................................................................... 58 More Complex Window ......................................................................................................... 59 3D Text ................................................................................................................................... 61 Glazing Assembly ................................................................................................................... 62 Curvy topped Window ........................................................................................................... 63 The 6.5 User Interface – part 2 ............................................................................................... 67 Command Statements in the User Interface (UI) ................................................................... 69 You want a Pictorial Value List? .............................................................................................. 71 UI Design Guide ..................................................................................................................... 72 UI Interface – all the bells and whistles ................................................................................. 73 Fire Extinguisher revisited: 6.5 ............................................................................................... 76 Let’s make a Door! .................................................................................................................. 77 Anglepoise Lamp .................................................................................................................... 83 Recursive Tree ........................................................................................................................ 85 Tree questions ........................................................................................................................ 87 Kitchen Chair .......................................................................................................................... 88 Northpoint .............................................................................................................................. 91 Some more GDL Syntax – Strings, REQUEST, IND, SPLIT .................................................... 92 Long Handrail – Swing the Cat! .............................................................................................. 93

The GDL Cookbook 3

CONE-shapes ......................................................................................................................... 95 RhombiCubOctahedron ......................................................................................................... 96 Helix and Spiral forms ............................................................................................................ 99 DXF conversion .................................................................................................................... 103 Desktop Clock ...................................................................................................................... 107 Analog Clock ........................................................................................................................ 108 Fountain ................................................................................................................................ 109 Curtains! ................................................................................................................................ 110 Spiral Handrail (Swing the Cat again!) ................................................................................. 112 Curved Windows – the hidden secrets ................................................................................ 114 Stretchy Edging Tool ............................................................................................................ 117 Boundary Survey Tool.......................................................................................................... 118 Storey Sensitivity .................................................................................................................. 119 TEXT and DATA GDL Add-ons – The secrets of File I/O .................................................... 120 TEXT & DATA GDL Add-ons – Variable type issues ........................................................... 127 Saving Parameter Sets .......................................................................................................... 128 Custom Zone Stamp ............................................................................................................. 132 Lattices – Winged Truss – 1 .................................................................................................. 134 Lattices – Winged Truss – 2 .................................................................................................. 136 Building Lattices ................................................................................................................... 137 Catamaran ............................................................................................................................. 142 Squiffle – revisited ................................................................................................................ 146 Cable Macro .......................................................................................................................... 147 Secrets of Wrapping Textures – COOR VERT and all that................................................... 148 Create a CYCLORAMA for your VR Panorama .................................................................... 150 VR rendering with backgrounds .......................................................................................... 152 Let’s make a background ..................................................................................................... 152 Cast Shadows with Alpha Channels..................................................................................... 153 Cast shadows with Alpha Channels and do it with GDL..................................................... 155 Animated Flag....................................................................................................................... 156 Bendy Bar! Reinforced Concrete assistant .......................................................................... 158 Curvy Roof ............................................................................................................................ 160 String Parsing ........................................................................................................................ 162 String Wrapping .................................................................................................................... 163 Hider – 2D whiteout ............................................................................................................. 163 Arches and Waves!................................................................................................................ 164 Multilingual Object ............................................................................................................... 167 Cellular/Castellated Steel Beam ........................................................................................... 169 Arched Cellular Steel Beam .................................................................................................. 171 Hyperbolic Paraboloid ......................................................................................................... 175 Tents? – the big question ...................................................................................................... 178 Making Choices – binary decomposition ............................................................................ 183 Gourd with COONS ............................................................................................................. 184 Furniture Legs! – and how to make them ............................................................................ 187 Calculate Menu ..................................................................................................................... 189 Special Menu ........................................................................................................................ 192 Master_GDL.GDL ................................................................................................................. 193 Make your Building Grow! ................................................................................................... 193 Tips and Tricks 4 page special ............................................................................................. 194 How do they do that? ........................................................................................................... 198 Developing with API ............................................................................................................ 203 Developing with GDL .......................................................................................................... 203 Look at the APIs – Profiler.................................................................................................... 204 Appendix: Page turning in the UI + Master End.................................................................. 205 Index: Discovery .................................................................................................................. 206 Index: Voyager ..................................................................................................................... 207

Voyager: Tips and Tricks Some useful guidelines ....................................... 1 Redefining Magic parameters ............................. 7 Picture Objects.................................................... 8 Squiffle ............................................................... 8 PICT or TIFF or JPEG? .......................................... 9 Rendering – Speed ............................................. 9 Preview images .................................................. 9 Use the GDL Manual! ......................................... 9 The Digital Architect ........................................... 9 FormZ ................................................................. 9 Roof Cutting ....................................................... 9 Rendering into Photo ........................................ 10 Recording contract drawings, long term ........... 10 Stationery File – keep your settings .................. 10 True Line weights in 2D .................................... 10 Printing in EPS .................................................. 10 Pens changing when opening DWG files .......... 10 Transferring favourite settings .......................... 10 Making scripted objects stretchy or squeezy .... 11 Servers with Teamwork – try iMac! .................. 11 Tracing Scans .................................................... 11 Compression Advice ......................................... 11 Wirelines in Rendering ...................................... 11 Bounding Boxes in 2D ...................................... 12 Batch Rendering Stills ....................................... 12 Animation / Flythroughs ................................... 12 Vertical Stretchy Objects – zzyzx ...................... 13 Protecting your Scripts ...................................... 13 DWG 2D Import – Layers .................................. 14 Rendering – textures ........................................ 14 DWG Export advice ........................................... 14 Memory Management ...................................... 14 Memory Settings .............................................. 15 DXF Import 3D .................................................. 15 Varying Line Hardness ...................................... 16 Writing with Acrobat ........................................ 16 Remove that annoying Error message .............. 16 Objects available on the Internet ...................... 16 Syntax errors with CALL & PICTURE ................. 16 Emptying the buffer .......................................... 21 TUBE+TUBEA Mental Health Warning! ............ 22 Hot MESH Tip! .................................................. 23 Freeform surface making .................................. 24 Do it with PUT & GET ....................................... 24 Masking codes .................................................. 25 Extrude vs. Prism .............................................. 27 Lost your Toolbar? ............................................ 30 A practical use for FRAGMENT2... .................... 30 Oddity of PUT & GET ........................................ 35 3D View to Symbol ........................................... 35 Golden Rules for macros: .................................. 38 Remember: ‘SOH CAH TOA’ ............................... 39 Maths Tips and Tricks ....................................... 40 ArchiCAD Training, and PEN Errors ................... 43 Dynamic Line numbers! .................................... 44 Advertising Feature........................................... 44 Hotspots – 3D No show .................................... 48

The GDL Cookbook 3

Section Fill ........................................................ 49 Teamwork Problem ........................................... 58 Show the Blade! ............................................... 58 Calculate the volume of a Mesh ....................... 59 Writing for older versions ................................. 59 Curved top windows, CUTEND time saver ........ 65 Turning Pages in the UI ..................................... 73 Visual GDL and coloured script ......................... 74 Mental Health Warning! [UI] ............................ 75 Laurent’s Advice on UI ...................................... 75 Using another monitor...................................... 84 Tree questions................................................... 87 Autosizing text in 2D ........................................ 90 Getting Strings to work correctly ...................... 98 Why do you need to do a Helix? ....................... 98 Rules for Curved Windows/Doors ................... 114 Beams are groovy! ......................................... 124 GSM file naming ............................................. 125 Faithful old objects no longer so? ................... 126 GDL Toolbox ................................................... 126 Modify EPS line weights ................................. 127 Move them hotspots! ..................................... 133 Building Lattices ............................................. 137 Doing it with Alpha Channels : think BIG! ...... 141 Fonts or what? ................................................ 145 Architects can create Web sites ...................... 147 Deliberate Errors ............................................. 147 No ‘On Error’ is an error: FIX!! ........................ 167 Delete unwanted layers .................................. 168 ‘Quote marks’ ................................................. 168 Artlantis – 3 Questions ................................... 172 Setting Standards: use a Module .................... 176 Reasons to use ArchiCAD-Talk: No. 1 .............. 177 Hide window symbol? .................................... 177 Cookbook is for life, not just for Christmas! ... 191 Speed up your Rendering ................................ 194 Top Maths Trivia – Find the Circle Centre ........ 194 ArchiCAD-Talk on the Web! ............................ 194 FAQs on the Internet ....................................... 195 2 ArchiCADs for the price of one! ................... 195 MASS – terrain modelling ............................... 195 Putting Roads into the Mesh tool ................... 195 ArchiCAD-Talk on the Internet ........................ 195 Use Acrobat! ................................................... 195 Server advice .................................................. 195 Walls in conversion work ................................ 196 Battered Walls ................................................ 196 Use ArchiGuide!.............................................. 196 Digital Cameras and Kodak CD ....................... 196 Using Comments ............................................ 196 Quicker Section Elevations .............................. 196 Putting an ArchiCAD render into a photo ....... 197 Crashes on Interface and Parameter scripts .... 197 What about ArchiFORMA? .............................. 197 Making Patches scaleable ............................... 197 Lost your Toolbar? – revisited ......................... 201 A use for MASTEREND_GDL ........................... 205

The GDL Cookbook 3

About the Author/Editor/Publisher David Nicholson-Cole teaches Architecture at the University of Nottingham. This involves a lot of ArchiCAD and GDL. David is the founder of ExMicro Ltd (Apple Resellers), Marmalade (CAD & DTP); a director of; a GDL consultant to; a founder and evangelist with the GDL Alliance. He is available as a consultant to architects who want to use ArchiCAD as more than just a drawing tool. He has travelled extensively teaching GDL in Europe, North and South America, the Middle and Far East. David and friends put on the ‘ArchiCAD University’ event, a weekend learning festival of ArchiCAD, each September. When not using ArchiCAD, David likes being on his BMW Motorbike, or sailing on his yacht-share off the Suffolk coast. DNC in Tokyo, July 2000

About the Guest Authors Laurent Godel is Swiss, lives in Barcelona, and is a well known contributor to ArchiCAD talk and other GDL talking places. He is part of the GDLA and the ArchiCAD University team. Known as the ‘gdlguru’ in GDL circles, he is a expert on File I/O, and has created many utilities with GDL that most us us wouldn’t have thought of doing and wouldn’t be able to do even if we did! Frank Chin lives in Brunei and has provided David with some useful criticisms of the Cookbook. He has provided a valuable contribution on Texture mapping (Flagpole) and Ballistics (Fountain).

David says, Now that you have started with the Cookbook, I do request you to leave me with emails to say how you are getting on. This will be most encouraging, and will repay the many hours spent preparing GDL examples, Pagemaking, bookbinding, packing & posting, all to provide you with this ‘doorway’ into a higher level of skill. The Cookbook improves with encouragement and constructive criticism. I am always willing to dispense advice to Cookbook owners, so please, register your purchase.


Dwight Atkinson MAIBC is an Architect and Public Artist, living in Vancouver, Canada. He is highly popular with the ArchiCAD University crowd for his extrovert personality, and expertise with photorendering, GDL and Photoshop. Trevor Grant is an English architect who likes the challenge of using GDL for experimental work. Mick Kingsbury is an English architect, who also teaches at Nottingham University. Laszlo Vertesi is one of the senior technical team at Graphisoft, Budapest. Geoffroy Magnan is a Belgian architect.

Phil Cannon has been doing GDL longer than anyone in the UK, and provided the Tree model.

Steve Campbell is an architecture graduate working in Seattle WA on housing.

Alfred Man was one of David’s students and worked through everything in Cookbook 1 in a week – it changed his life. He now has a career in GDL and API development.

Bill Rattenbury of New Zealand is the author of ‘Project Framework’ published by Graphisoft.

Note to readers




he Cookbook started off as a set of web pages in 1997, and was a website. So many users asked for it in printed form that since 1998, it has now been available as a book. In December 98, the GDL Cookbook became ArchiCAD 6.0 compatible. The GDL Cookbook 2 of June ‘99 was a major rewrite with many exercises modified or added, with the theory-based Primer dissolved amongst the exercises to form a more progressive delivery of the information required to get you going with GDL. This is GDL Cookbook 3, with many improvements over Cookbook 2, such as more ArchiCAD 6.5 material, longer and better explanations of techniques, and explorations into many areas not covered by the previous books. The book is available in Acrobat format on the enclosed CD. With AC 6.x, if put into your Documentation folder, it will appear in your ‘Help’ menu.

Oleg Shmidt of Ryazan, Russia is an expert GDL, C++ and API programmer.

should like to thank: Howard Gill, my partner in LiftOff courses; Richard Swann for the idea of writing the sections on Theory; Dick Morgan for the idea of holding a Voyager course, and Chris Phillips for the idea of making it into a book; Sally Nicholson-Cole for keeping the office going while I do anything except working for ExMicro; my students for challenging me with difficult tasks which sharpen my skills; all the participants of the ArchiCAD-Talk conference who display unfailing patience in putting up with my many emails; John Stebbins, Kimon Onuma, Dwight Atkinson and others for their ceaseless support for the Cookbook and the GDL culture; Sanjay Patel of GDL Technology for his unfailing support and encouragement; Apple for providing me with G3 technology! The University of Nottingham for paying half of my salary so that I can be paid for what I enjoy doing most - teaching ArchiCAD! Finally, Graphisoft in Budapest for ArchiCAD itself.

The GDL Cookbook 3 The SOURCE of all that is good in GDL

Part 1 GDL Discovery

The GDL Cookbook 3 – Discovery

Introducing GDL (Geometric Description Language)


N the early days of ArchiCAD, the forerunner of ArchiCAD (RaDar) ran on a Hewlett Packard as a 3D Piping design solution. Yes, the original Graphisoft team designed 3D piping for nuclear power stations! Then they got more and more interested in the problem of wrapping buildings around the piping. Gradually they moved into architecture. Not having a mouse or windows, the ancestor of ArchiCAD was GDL-based – a scripting language to produce 3D form. The arrival of the Apple Lisa followed by the Macintosh enabled programmers to put the building plan into one window, the building tools into another (to form a palette of clickable buttons), coordinates in another, and so on. ArchiCAD as we now know it became visible – click, drag and click. Designers could drop walls and other building elements into a plan window, stretch them to fit and change their properties; view the 3D results in another window. GDL survived as a speciality, evolving in its own way as a means of building library objects.


DL COMMANDS – in their raw state are avail able to you in the GDL manual. It is difficult to understand their use and syntax until you have to apply them for real. Therefore, the cookbook approach in this book gives you an easier way of learning them by doing small projects, a bit at a time. The cookbook method is based on small projects, growing in complexity and a critical look at what we have learned from it. This is analogous to the process of architectural education. The GDL explanations in this cookbook runs systematically through all the 2D and 3D commands with small examples of the commands at work.


D ORGANISATION – You may not be able to build something in every detail, but you look at it, and decide what parts of it need to be included. You also decide how the object will behave if it is to be stretched or hinged, and what 3D primitive shapes – blocks, cylinders, cones, surfaces – would best produce the object.


ROGRAMMING – A program is just a sequence of instructions. You can read instructions to someone over the telephone, you can struggle through the instructions for setting the controls on your new video, you can explain a cookery recipe to a friend, or plan the most efficient way of mowing the lawn. There is even a program required in making a cup of tea! In all these cases you use a program, even if you didn’t think of it as a program. Suppose you write down the sequence of tasks, you would be sure to get them into the right order. You would try to avoid doing tasks you

Working with GDL consists of four main areas of knowledge


DL COMMANDS – produce 3D and 2D entities – like CONE, BLOCK, SPHERE, TUBE, POLY, ARC, REVOLVE and so on.




ROGRAMMING – the organization of the script in a structured way, observing rules of syntax.

D ORGANISATION – look at the object analytically and understand what 3D shapes it contains and what rules they follow.

NTERFACING with ArchiCAD – to enable the object to respond to conditions in the main project.

had just done, or doing tasks that would undo ones you had just done. You can write the sequence as a series of pictures, or as written commands. That’s all there is to it! Which language would you use? For cookery, you would speak in English, or French or Spanish, but you would use similar food ingredients. For GDL, you use the language of BASIC, and your ingredients are commands to produce primitives like BLOCK, CYLIND and CONE; and you can go on to make more complex shapes like TUBE. BASIC is the easiest of the major programming languages, devised in the seventies, and predominant on micros during the eighties. BASIC is easy to learn. Graphisoft must be thanked for choosing BASIC as the model for their programming language. We can all write a few lines of code, and see 3D objects springing up into existence. It’s fun! It’s intellectually challenging! One’s capabilities are vastly increased – in the ‘old days’ of programming, BASIC could build menu driven programs for dull things like accounts and calculations, many of which were far easier to do in spreadsheets. Now, with GDL, towers, chairs, bridges, space structures, buildings and trees can all grow from your keyboard.


NTERFACING – GDL objects can behave slightly intelligently in that they can know storey, scale, frame number, object’s location, current pen, camera position and so forth, and behave accordingly. If they are windows and doors, they can know current wall thicknesses and materials. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001 1.1

The GDL Cookbook 3 – Discovery

So, you think you can’t program...


ELL you can! Squirrels can program, birds can program, spiders do it, small children do it – in that they plan a series of actions, they try to get them in the right order, they correct their own mistakes when they make them, and they achieve a result – perhaps a hoard of nuts, a nest full of eggs, a web, or a Lego model. The British Standards Institute recently (Sept ‘99) received the ‘Ig Nobel’ Prize for Literature in that they wrote BS.6008: Method for Preparation of a Liquor of Tea, and took 5000 words to do it, going into the minutest detail! We will not go quite so far, but let’s use tea making as an example of human programming. Let’s write down a series of ‘Operations’ involved in making Tea. Without going into too much detail, list the sequence of operations to someone who knows the obvious things like how to turn on taps. Anybody reading this (above the age of 10) should be able to recite the following list in the right order.


EXT, you look at each Operation and realise that none of them are single Actions. Each operation consists of a number of Actions which might include Error Checking. For example, if the teapot contains last night’s teabags, then Wash Teapot. This might require quite a lot of IF statements, followed by the Actions taken as a result of the IF statements.

1. Fill Kettle with water 2. Boil water 3. Get teapot 4. Fill teapot with bags 5. Fill with water 6. Get cups 7. Wait until ready 8. Pour out 9. Add Milk 10.Serve Tea


Now because we are going to teach a computer how to make tea, you need to rewrite the list giving each Operation a number (with a colon), and use an exclamation mark to make each Operation name into a Label. For a human, you might number each task 1, 2, 3, etc, but for computers it’s easier to use larger numbers (because later, you could insert extra things you hadn’t thought of, like getting the sugar lumps.) 100: !Fill Kettle with water 200: !Boil water 300: !Get teapot 400: !Fill teapot with bags 500: !Fill with water 600: !Get cups 700: !Wait until ready 800: !Pour out 900: !Add Milk 1000:!Serve Tea


Depending on the level of knowledge or stupidity of the machine, you instruct it appropriately. For example we assume here that the machine knows how to turn a tap or a kettle on. In the same way, GDL knows that Cylinders are round and that Cones are tapered and round without us having to define ‘roundness’ mathematically.

The final program for making tea

100:!Fill Kettle with water IF kettle (empty) THEN (Fill kettle with water) IF kettle (filled) THEN CONTINUE:!Boil water

Goes around until kettle filled: 2 IF statements

200:!Boil water IF water (boiling) THEN (turn kettle off) ELSE (boil water)

A single line way of writing two IF statements People are ‘integer’ quantities; but this makes doubly sure that you can make tea for 2. For the ‘parameter’ of tea, you could let the user select from a list of choices. In the event of a major problem you might have to jump back to the start.



300:!Get teapot IF (number of people) less or equal to 2 THEN (GET smallteapot) IF (number of people) greater than 2 THEN (GET largeteapot) IF teapot (dirty) THEN (wash out teapot) UNTIL (clean) IF teapot (clean) THEN (swirl hot water) UNTIL (warm) IF teapot (warm) THEN (Fill teapot with bags) !continue 400:!Fill teapot with bags LET teatype=USERCHOOSE(EarlGrey,Lapsang,Camomile,Tetleys) IF teapot (large) THEN add 2 teabag USING teatype IF teapot (small) THEN add 1 teabag USING teatype 500:!Fill with water POUR water INTO teapot UNTIL (full) IF (not enough water) THEN GOTO 100: PLACE teacosy UPON teapot START timeclock USING seconds

Continued next page Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery 700:!Wait until ready IF TIMECLOCK less than 120 seconds THEN WAIT

This was going on while you were getting the cups. Another repeating ‘Loop’

Another example of getting the parameter from the user’s choice.

Now this isn’t written in BASIC, and it isn’t written in GDL, but it’s close to both of those two, and shows that programming can be like writing in English in a slightly mathematical style.


800:!Pour out REPEAT (on the teatray) IF fullness=0 THEN POUR (a cup) UNTIL fullness=7/8 UNTIL (enough cups for everybody) 900:!Add Milk LET milkcondition=USERCHOOSE(with milk,without milk) REPEAT (for each cup on the teatray) IF milkcondition=(with milk) THEN (add milk to cup) UNTIL (each cup tested) 1000:!Serve Tea 1100:!Tea too hot, pour into saucer and drink from that !...vicar is shocked!


K, we can’t all be perfect. The British Standard says put the milk in the cup first, and of course, I haven’t tested to see if the users have chosen sugar, or want spoons, saucers or biscuits. And what happens if there isn’t enough tea for everyone? Then you have to loop back and top up the teapot, or even reboil the kettle. This could be built into the program. That level of detail and error correction would make the program more professional and user friendly. I hope this shows the sort of thing you can do, and has persuaded you that you can indeed write a program.

How do you make an Object? (so many questions...) Look at it as if through half closed eyes.....

Does it need to be stretchy?

See it like this in your mind’s eye, to reduce the object to what you feel is essential about it, and then you ask...

We are all familiar with autoscripted objects being stretchy. But does it really need to be stretchy? Or can the stretchiness be controlled to make the object stretch smartly? And then you ask...

Can you draw it in 3D on paper? If you can sketch it in 3D, you are well on the way to understanding how you would build it in GDL, and then you ask...

What are its primitive forms? Most things can be simplified to the simple shapes of cylinders, blocks, and cones; furthermore, you can perceive tubes, surfaces, prisms and lathed elements; and then you ask...

Does it need to LOOK right, or BE right? Is this a quick little object that adds authenticity to a 3D rendering but doesn’t need to be accurate? – or is it required to look good in detailed sections and plans in a construction drawing? And then you ask...

What Level of Detail (LOD) does it require? If it’s for a rendering, you may be seeing it fleetingly during a flythrough, or requiring it for an Artlantis closeup. For a construction detail, it could be scale sensitive so that it shows detail at 1/20 and 1/50 but simplifies at 1/100 and 1/200. Your object may be making too many polygons if it is curvy. Consider LOD constantly; and then you ask...

Could it be 2D only? Some objects are only required for the 2D drawings. People, trees and furniture could be 2D entities that appear only in plans sections and elevations; perhaps you needn’t bother with the 3D; and then you ask...

Will it be an Object, or a Tool? It may be a single piece of furniture. But if it’s a cladding panel, fencing, handrail or similar, it may be more akin to a Tool, whereby if you stretch it, you get more and more objects. And then you ask...

How smart does it really need to be? If it is a tool and it is an investment, you can make it smart – know the 3D rules of its existence, how to behave when stretched. But some objects can be so smart they can be annoying to the user, and can take too long to develop. And then you ask…

Does it need to appear in listings? This is increasingly important with manufacturers jumping to the realization that they can make libraries of their products in GDL, not just in DXF. The object may need to have accurate names and serial numbers in the property scripts and smart value lists to ensure that the name/number corresponds to the object. And then you ask...

Can complex problems be solved with textures? Recognise when 3D forms or surfaces are so complex that a texture will solve them better then modelling – for example leaves, tiles etc. And then you ask...

Have I got the ability to make it? If not, then here’s the chance to learn new tricks!

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

First Look at GDL


ROM the File menu, open any 3D object and have a quick look at the way the Parameter window is organised. A popdown menu (in 5.0 or 6.0) or a vertical button bar (in 6.5) allows you to view the script and window types. The main scripts and windows in GDL are these below. For beginners, you only need to use the 2D and 3D scripts. If you press the grey buttons, the scripts appear in the main window. If you press the white buttons, the scripts appear in independent floating windows.


aster Script: use this for housekeeping tasks such as reading in Value lists, setting up Parameters, checking user Errors, defining Materials, setting Flags and so on. Information in the Master Script can be used by the 3D Script, the 2D Script and the Properties Script. If you didn’t use a Master Script, you would have to write all these things time and time again. D Symbol: is a window into which you can paste a 2D image, or draw using 2D tools, but it will only be displayed if there is no 2D script. With GDL knowlege, you are better to write a 2D script. D Script: this can be used simply to tell GDL to draw in 2D whatever it finds in 3D (Project2), or whatever is in the 2D Symbol window (Fragment2). You can (and should) use it for writing a parametrically organised script to draw what the object will look like. By designating Hotspots, the 2D script can also govern how stretchy the object can be. By leaving this script blank, the GDL object will display what ever is drawn into the 2D Symbol window. If you leave both blank, the object will not show in the project. D Full View: this is generated by the 2D Script. This will not show what is in the Symbol window (unless commanded to.) D Script: the primary means of building parametric 3D objects. If the object is simple, almost all the work can done in the 3D Script. D View: is generated by the 3D Script – not to be confused with the 3D window of the main project. As you cannot place a camera in GDL, this is usually a 3D axonometric view.

2 2

2 3 3 1.4


roperty Script: here you can write Components and Descriptor commands if the object is to be in a schedule. arameter Script (a.k.a. Value List): this is the means of creating Pop-Down menu selections in the main parameters box; also for locking or altering parameters. omment: is a small text field in which you can write a small set of instructions to your user on how to use the object, or could place a copyright statement/ signature. review Picture: is a window containing a pasted in bitmap image of a view of the object. It tells the user what the object will look like in its setting, and could come from Artlantis Render or an ArchiCAD photorendering. This becomes the Icon of the object in the settings box finder. arameter table: we also fill out the table of parameters by hitting the New button, and filling in the small details. A, B and ZZYZX are ‘obligatory parameters’ – they already exist – but we can make many more. The Components and Descriptors buttons are used when you build a ‘Property Object’. ser Interface Script: This enables you to build a Custom dialog box with your own text fields and images, with buttons and input fields for the user to enter parameters. It is great for complex objects where the user might need more explanation on the use of the object or visual choices of style and form (AC-6.5 onwards).



Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Working in 3D space: 3D Cursor


UST HOW do you write in GDL in 3D? Well, when you are word processing, you move your cursor to a location and start typing. Move the cursor, and type again, and the new words appear at the new position. With GDL, you have a 3D cursor; you can move the cursor; when you issue a 3D GDL command like BLOCK or CONE, you will get a 3D object wherever the 3D cursor happens to be. Move the 3D cursor to a new position and issue the same command and now it appears in the new position.

Thus to make a chair, you can move to each corner, plant a chair leg, then raise the cursor up to plant the seat and finally, move the cursor to plant the back of the chair. When you have achieved a group of things (like a bunch of chair legs), you have completed a task. So now return the cursor to the global origin. Now you can depart and do another task, for example the seat of the chair. When you have finished, you can do a small 2D script so that a 2D symbol will appear in the project plan, save the file, and you are done.


IRST GET acquainted with the idea of the X, Y, Z universe that you have to work in. All locations are defined in these coordinates. We have to simplify our ideas of space so that poor idiot computers can understand where we want the 3D cursor to go. If you want to move sideways, you move the cursor in the X direction. If you move forward, you move it in a Y direction. If you move up or down, you move it in a Z direction. You can Rotate the cursor and the XYZ world gets rotated too. • The ‘G’ (global) coordinates remain fixed at the Origin of the model. When you bring an object into the project plan, this origin is what decides the height of the object in the project. The origin should be planned carefully – preferably at the base of the object, and at the axis of any symmetry or rotational axis that you perceive. • The ‘L’ (local) coordinates are, in the 3D sense, the Moving Cursor in your model – they travel with you, wherever you are drawing an component. Always try to return the GDL cursor to the origin before you start out with another element of the model.


The Cartesian XYZ Universe y

G,L x G=Global Origin L=Local origin

Tips and Tricks for ArchiCAD users Introduction


HESE are spread through the GDL Cookbook like nuggets of gold and are about ArchiCAD in all its forms, not just GDL. In this edition, they are grouped somewhat more heavily in the Voyager section. I first used them to fill space at the bottom of pages. When I want to expand on a topic in a later edition, I move the tip to another page to free up space. Please email me any tricks you want adding. The best place to find Tips and Tricks at their place of origin is to be a member of the ArchiCAD-Talk list server conference, on the Internet. Although I have tested out all my own tricks here, many of the ideas for them started from questions and answers on that conference. Try it!

Use the GDL Manual!


OST ArchiCAD commands are covered in full in various sections in the GDL Cookbook. But please note that it is not the function of the Cookbook to replace the GDL Manual. You need to use both. You will find the GDL Manual a lot easier to read now you have tried the Cookbook. You will also find sections of the Cookbook easier if you dip into the manual.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


DL is not just for 3D objects! Objects them selves can be 2D or 3D (furniture, building components, utilities/productivity tools, trees and people. GDL can make Windows and Doors which know how to cut holes in walls; Lamps, Zone stamps and Labels. They can be pure script (e.g. a list of materials); Macro object (e.g. door handle, tap, door); Property object, or Stairmaker part. 1.5

The GDL Cookbook 3 – Discovery

Your first 3D Elements


NTIL you feel ready to progress to PRISM and other more powerful commands, get used to building 3D GDL objects using the items on this page. These are the essential primitives of 3D building. It is amazing how much you can do with these. These examples also demonstrate the simple-to-use cursor movement commands of ADD and ROT (see later for further explanation).


is the primary building block of GDL, and with X,Y,Z dimensions for the parameters, you can’t get much simpler. In GDL projects it is actually rather limited to use; you have to get the cursor to the lower left corner of a block, and you have no control over corners, lines etc.

!Block Demonstration !Syntax:- BLOCK x,y,z BLOCK 0.3,0.2,0.25 ADD 0.1,0.1,0.25 BLOCK 0.1,0.1,0.2 DEL 1

Some existing Graphisoft library objects use BRICK – but it works to the same syntax.

CYLIND drives a cylinder up the Z axis. If you want a cylinder at an angle, you first have to rotate the cursor with a ROT command so that the Zaxis points in the desired direction. Note that RESOL 6 or 8 can change Cylinders into hexagons or octagons. If you do not write a RESOL command, the cylinder will have 36 sides.

!Cylind demonstration !Syntax:- CYLIND height,radius CYLIND 0.2,0.05 ADDx 0.2 RESOL 6 CYLIND 0.2,0.05 RESOL 8 ADDz 0.15 ROTy 45 CYLIND 0.1,0.03

SPHERE is the easiest one of all –

!SPHERE demonstration !Syntax:- SPHERE radius !RESOL sets the number of faces SPHERE 0.1 ADDx 0.2 RESOL 12 SPHERE 0.05 DEL 1

but the one most likely to cause you to have so many polygons that ArchiCAD will have trouble rendering it. Use strict control of the surface resolution with RESOL commands. If you do not specify resol, the resol value is assumed to be 36, which means that the sphere will have 648 faces! RESOL 10 is the smallest that still looks spherical.

ELLIPS produces a hemisphere, but by changing the height, it can be distorted into a bullet shape. RESOL can be used to make it look polygonal. ELLIPS is always solid. If you want a hollow dome, you need to use REVOLVE.


By the way, if you want the cursor to return to the origin, you would have to finish this script with a DEL 3.

By the way, the single sphere on the left, if saved as a DXF 3D file would require 21,000 lines of code to describe it.

!ELLIPS demonstration !Syntax:- ELLIPS height,radius ELLIPS 0.2,0.06 ADDx 0.15 RESOL 12 ELLIPS 0.16,0.04

When you use any curved surface, always set the lowest resolution that will look acceptable – to reduce rendering time. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

3D & 2D Cursor Movement A

DD dx,dy,dz, ADDx dx, ADDy dy and ADDz dz are the way to move the 3D cursor

from location to location. Most frequently, you add in one direction, X, Y or Z, but when you want to move in two directions or more it’s more economical to use the ADD dx,dy,dz command to do 3 in one go. The best way to get the hang of these movements is to launch into typing in some of the exercises.

ADD2 dx,dy is the 2D equivalent of ADD, but is is not as often used, because many of the 2D commands can be issued without moving from the origin. For example in 3D, you might go: ADD 1,1.5,0: CIRCLE 0.5: DEL 1

but in 2D it is: ADD2 1,1.5: CIRCLE2 0,0,0.5: DEL 1

but this can be shortened to: CIRCLE2 1,1.5,0.5

Above: the primitives all exist in the same 3D space. Below: after a few easy cursor movements, they are all distributed correctly

Try making something very simple!


RY writing something using the simple GDL commands you have just learnt. If you issue the commands (BLOCK, CYLIND, SPHERE and CONE) you find them all jumbled together at the origin and all being a horrible colour. Immediately you can see that they look better if you specify a PEN and a MATERIAL. Use a Material name that is in your Library. This looks like nothing in the real world, so you have to learn 3D cursor movement from day one. With a few ADD, ROT and MUL commands, you can create something usable. It’s a case of lifting the cursor into position, issue the 3D command; either progress to the next 3D object, or use DEL to return to the origin. Experiment with changing the dimensions and modify the cursor movement statements.


PEN 1 MATERIAL 'Whitewash' BLOCK 1.0, 2.0, 3.0 CYLIND 1.0, 1.0 SPHERE 1.0 CONE 4, 0.5, 0.1, 90, 90

Try changing the dimensions of these simple solids

!Cursor Movement Try changing the values PEN 1 of the ADD, ROT and MATERIAL 'whitewash' BLOCK 1.0, 2.0, 3.0 MUL command to see ADD 1.0,1.0,1.5 what happens. Click in ROTy 90 the 3D View window in CYLIND 1.0,1.0 ADDz 2.0 GDL MULz 0.5 SPHERE 1.0 ADDz -2.0 CONE 5, 0.5, 0.1, 90,90 DEL 5

UL means Multiply – along the axis stated.

So MULz -1 converts all references to Z to negative, MULx 0.5 halves everything in the X direction – and so on. You can use a MUL x,y,z command and do three multiplications at once. What MUL means in reality is that you can use it to change the scale of entire objects or parts of objects – all ArchiCAD Autoscripted objects use MUL to enable objects to be resized, or to be stretchy. Objects can easily be mirrored by MULtiplying by -1 around the mirroring axis. Symmetrical objects are labour saving, as you build just half, then mirror around X, Y or Z. MUL2 x,y is the equivalent command in 2D scripting environment.MUL2 must be expressed in terms of x and y. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

!MUL Demonstration ELLIPS 1,1

!MUL Demonstration MULx 0.5 ELLIPSE 1,1 DEL 1

!MUL Demonstration MULz -1 ELLIPSE 1,1 DEL 1

Starting with a plain ELLIPS... (half a sphere) you can make it shrink to an elliptical plan shape by MULx or can flip it vertically with a MULz.


The GDL Cookbook 3 – Discovery


OT means Rotate the Cursor around an axis. You use it in the form of ROTx, ROTy or ROTz. You use them one at a time. You use them in the order that logic tells you – the order is vital. Rotation is normally positive if it is in the anti-clockwise direction. If you want to rotate clockwise, you can rotate a negative quantity such as ROTz -90. There is a combined ROT command, but it is not used in the way that you use the combined ADD and MUL commands. The ROT command rotates the object around a vector – defined as the line connecting 0,0,0 to a point defined by an X,Y,Z definition. It is unexplained and unillustrated in the GDL manual, so here is a simple example! It is very effective if the circumstance arises where it is needed: when it is, you will recognise its usefulness.


EL means “Delete the most recent Cursor

Movement command” – ADD, MUL or ROT. DEL 2 means delete the last two. DEL is the most important command of this page. If ADD and ROT are components of the engine, then DEL is the braking system – just as important in the performance of your motorcar. If you go somewhere, you have to be able to return! If you do not control the cursor, your model will be unmanageable after a page of script. Therefore, use DEL to return to the Origin as often as possible. One bad way to get back to the origin is to repeat all your moves backwards. For every ROTy 45, you do a ROTy -45, and so on, in reverse order. This is not good! It is much easier to use the DEL command. The ROT, MUL and ADD commands are stored in a stack, and if you DEL 1, it knocks one off the stack. If you DEL 4, it knocks the previous 4 off the stack – in reverse order. You can also DEL using a variable like DEL num. If you use subroutines, DEL must match the number of Cursor movements within a subroutine. Look at the small number of commands on this and the next page to see how DEL is used. The DEL command cannot run past the stack. If you DEL 2 when there is only one item to delete using DEL, you will get an error message.

PEN 7:MATERIAL ‘zinc’ ROT 1,1,1,-60 BLOCK 1.0,0.5,0.8 DEL 1


is the equivalent in 2D of the ROTz com mand. One of the problems of 2D scripting is that you dont have a visible cursor, so if you do a lot of ADD2 and ROT2 and MUL2, you need to imagine the cursor’s location.


EL TOP removes all the Cursor commands – returns you to the Origin of the model by brute force. DEL TOP is useful because GDL does not declare an error when you use it, even if there is nothing to DEL. So you can put it at the end of a script, and not worry about an error occuring. However, it is far better to control the model by using DEL intelligently – with every subroutine – so that you never need to use the DEL TOP command until the END statement. DEL TOP is dangerous – apart from encouraging you to program in a sloppy fashion, it can wipe out global commands (like ‘ROTx 90’ or MUL commands to make the object stretchy) that existed at the beginning of the script.

DEL NTR( ) not DEL TOP NTR( ) is a neat way of counting how many cursor movements (‘transformations’) have been done. If you have a series of subroutines all of which have to return to the origin, you could consider using DEL TOP before each RETURN if you are too lazy to count the number of Cursor moves. However, if you have a couple of global moves such as a ROTx 90 or a MULz at the very start, then you cannot use DEL TOP. DEL NTR( )-2 will have the right effect without nullifying those first two transformations. Mind you, it’s easier just to count and DEL the correct number.

A Note on Spelling

Typograpical note

Some of my friends in the USA and elsewhere must think sometimes that the author of the Cookbook is quite illiterate – I mean who could possibly spell ‘inquiries’ as ‘enquiries’, ‘realize’ as ‘realise’, ‘color’ as ‘colour’, or ‘story’ as ‘storey’? Well there is english english and there is ameringlish. Remember the romantic song about ‘I say tom-ar-to and you say tom-ay-to’?? Vive la Difference! For me to be consistent, I am trying to stick to UK spelling conventions and the Chambers English Dictionary.

In reading this you have already expressed a serious interest in GDL – so let’s bring in a good discipline at the start. Write all GDL commands in UPPER case, and all variables (parameter names) and comments in lower case. The machine is not case sensitive, but you are, and when reading and debugging your scripts later, you will find it easier if you follow this advice. If you find yourself working on GDL as part of a team you need to agree on a format, so this is a good rule to follow. It is followed in the Cookbook.


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Your first object... ...a very simple Chair You want to do something practical? Well try this VERY simple little kitchen chair for a starter. Turn over the page for some guidance on cursor movement.


ROM the File Menu, Select New Library Part->Object, and you will get a new Library Part opened, and from this, you will be able to pull up the 3D Script window. This simple chair starts life from its front right leg. It is valuable to do 3D Script each part in stages, and to move the This simple chair is entirely composed of the BLOCK command. Move the cursor back to its origin at the end. 3D cursor from place to place, drawing a Block in each place, and then move on. The syntax of Block is very simple, just BLOCK x,y,z. You define !Simple chair !3D Script - Imperial the X, Y, and Z dimensions of the block and it always grows outwards from MATERIAL "Whitewash" the bottom left corner of the block. PEN 1 Notice that the stages of the script are marked with labels (or ‘com- !Legs ments’) which all start with an exclamation mark. When you look at the BLOCK 2",2",18" ADDx 16" script later, you will know what’s what if you have labelled frequently. BLOCK 2",2",18" ADDy 16" As you build each Block, you use the ADDx, ADDy, ADDz or ADD BLOCK 2",2",30" commands to move the cursor to the next location, then build the next ADDx -16" Block. After a group of commands is completed, get the cursor back to the BLOCK 2",2",30" DEL 3 start before doing the next group, using the DEL command – this ‘undos’ !Seat the number of ADDs that you have made. Make sure that at the very end, ADDz 18" you have moved the cursor back to the origin of the model. BLOCK 18",18",2" DEL 1 If you do not specify a material, your objects will turn out all one colour, !Back which can be disconcerting. So the PEN and MATERIAL command is one ADD 2",16.5",24" of the first ones you learn. PEN 1 in my ArchiCAD 6.5 is black – set what- BLOCK 14",1.5",12" DEL 1 !Back to origin ever colour you want. If you do not have ‘Whitewash’ in your Materials library, then find another material name to use for the chair. This example is done in Imperial – to please all the American readers of !Simple chair the GDL Cookbook. All native GDL scripting has to be done in Metres (not !3D Script - Metric millimetres). If you wish to write in Imperial, you can, but each number MATERIAL "Whitewash" must be clearly signified with Foot and Inch symbols. For Imperial users, PEN 1 !Legs the first things I suggest (apart from changing to metric) is to work entirely 0.05,0.05,0.45 in Decimal Inches, as this avoids spurious punctuation marks and maths BLOCK ADDx 0.40 operators such as in 1'-2 3/4". BLOCK 0.05,0.05,0.45

2D Symbol The ArchiCAD objects that are autoscripted from the Wall/Floor/Roof tools always have their own 2D symbol or script. When you write a script yourself, you need to create the 2D symbol. You can write a tiny script. Open the 2D-Script Window and use this ‘killer command’: PROJECT2 3,270,2. It is very powerful and solves your need for a 2D symbol at a stroke. It draws a Plan view of the 3D object [3], with a camera angle of 270˚ [270] and it is in hidden line [2]. Your 2D symbol will be given Hotspots by ArchiCAD. Throughout the book I encourage you to write 2D scripts properly, so later we shall look at 2D scripting in GDL. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

ADDy 0.40 BLOCK 0.05,0.05,0.75 ADDx -0.40 BLOCK 0.05,0.05,0.75 DEL 3 !Seat ADDz 0.45 BLOCK 0.45,0.45,0.05 DEL 1 !Back ADD 0.05,0.415,0.60 BLOCK 0.35,0.035,0.30 DEL 1 !Back to origin !Chair - 2D-Script PROJECT2 3,270,2


The GDL Cookbook 3 – Discovery

Your First 2D Elements


NLESS you have a 2D Symbol or a 2D Script, your object will not appear on the Project Plan! If you been using ArchiCAD’s conventional tools to make library objects, you have been used to it making automatically generated scripts, and automatically drawn 2D symbols generated from the view of the object.

HOTSPOT2 x, y places a Hotspot at the point x,y in the 2D symbol of the object. It lights up when you select the object. The purpose of HOTSPOTs are 4-fold: To enable you to see objects when touched or marqueed, to pick up the object, to make objects stretchy, and to provide ‘gravity’ for snapping objects to line or to other hotspots.

LINE2 draws a line from one XY location to another XY location – relative to your current cursor position.

RECT2 draws a rectangle from one XY loca-

Complex objects may be very slow to draw in 2D if you use the PROJECT2 command. A 2D script using LINE2 and accurately reflecting the trigonometry of the object without showing excess detail may be perfectly adequate for the 2D symbol. You could offer the user an option to show greater detail if the plan is larger than 1.50 or 1/2”-1’ scale.

tion to another XY location diagonally opposite – relative to your current cursor position and angle. RECT2 is always wireline (you can see through it).


is a command that you MUST learn, even with your first scripted Object! Until you learn parametric 2D scripting, the easiest thing is to write a short 2D script containing PROJECT2 3,270,2. This reads the 3D Script and draws whatever it can see, faithfully, in wireline or hidden line view. Be warned – it could slow down the time it takes to draw the symbol. PROJECT2 should be learnt parrot fashion, you will use it many times!




PROJECT2 has interesting possibilities. For example, it can be told to display the object in the Project Plan in elevation or axonometric form. Together with HOTSPOTs in the right places, you can make things stretchy in the vertical direction. Or you can use it for a quick view of the elevation of the object to make sure that you have set it up correctly. Perhaps by now, you have noticed that every command in 2D scripting ends with the character ‘2’


Project2 demonstrated From the single object, you can get many representations on the floor plan. 1.10

!Typical short 2D Script for any 3D object HOTSPOT2 0,0 PROJECT2 3,270,2


8,270,2 9,270,2



Note that -7, -8 and -9 are the same as their positive equivalent, just upside down! Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

2D script for the simple chair 2D Symbol For the Simple Chair, we used a PROJECT2 command – the killer command that does most of the 2D work for you! Throughout the book, I encourage you to write 2D scripts properly. Scripted 2D symbols are faster for ArchiCAD to draw, and they put you into the driving seat – enabling you to decide how they shall look. Let’s look at how to write a 2D Script. Please Find and Open your Simple Chair model. This example is done in imperial and metric. Start with Project2, and make sure that your new lines follow the outline correctly. Build the whole chair from rectangles and a line. RECT2 defines a rectangle from the X,Y location of the bottom left to the X,Y location of the tip right. LINE2 is similar, joining two X,Y locations together. Leave the old Project2 as a comment in case you need it back.

!Chair - 2D-Script !Imperial !PROJECT2 3,270,2 HOTSPOT2 0,0 !Seat RECT2 0,0, 18",18" !Legs RECT2 0,16", 2",18" RECT2 16",16",18",18" !Back LINE2 0,16", 18",16"

!Chair - 2D-Script !Metric !PROJECT2 3,270,2 HOTSPOT2 0,0 !Seat RECT2 0,0,0.45,0.45 !Legs RECT2 0,0.4,0.05,0.45 RECT2 0.4,0.4,0.45,0.45 !Back LINE2 0,0.4,0.45,0.4

Curvature Control


OST of the workload of the processor during rendering is working out the values of light and shade on each surface (polygon) in the model. If it is trying to work out Shadows, it’s also working out the outline of the object and what the shadow will do when falling on each polygon. Fewer polygons means faster rendering. An excess of polygons will lead to excessive rendering times, or it may cripple the model altogether – not enough RAM to finish! Sometimes, the object you are doing may not be visible (such as a nut or bolt) so why give it 36 or more polygons, especially when there could be thousands of nuts and bolts in the model? So control the curvature!

RESOL is used extensively RADIUS is even more useful than TOLER is an interesting way of setthroughout this Cookbook as a way of controlling the resolution of curvature of curved surfaces such as Spheres, Cones and Cylinders. RESOL simply tells GDL how many surfaces there are to be in 360˚ worth of surface. The default resolution is 36, so a single sphere will have 648 surfaces right from the start. Get it down to the lowest practical quantity – or even lower. If you are Photo-rendering the resolution can be set even lower. It is a good tip to set resolution to an odd number – 5, 7 or 9 look more cylindrical than the patently hexagonal look of RESOL 6. RESOL cannot be less than 3. RESOL can be controlled by a variable, for example RESOL 6+10/dd will make the resolution higher as the distance to camera ‘dd’ reduces. If the resolution is stated as a real number – eg 6.35, it is always rounded down.

RESOL because it gives you 3 RESOL commands in a single line. Some objects such as a curved handrail have two curves to resolve, the curve of the handrail and the curve of the tubing. Some curves are so small (such as holes drilled into a steel plate, or thin cables) that even if they were RESOL 3 they would look good. You state RADIUS in the form:

ting Resolution of curvature, and the most powerful. TOLER is the distance from the actual arc of the curve, and the distance you are willing to allow the chord of the curve to exist away from the curve. GDL will recalculate the resolution to match the object. For example, a TOLER of 1 mm (1/25”) is ideal for tubular furniture and does a good job on curves. It’s even better on very large structures where a maxiRADIUS rmin, rmax Any curve equal to or less than ‘rmin’ mum of 36 needs to be exceeded. will render with 6 faces. Any curve TOLER could be set using variables equal to or more than ‘rmax’ will or IF statements, just like RESOL or render with 36 faces. Any curve be- RADIUS. TOLER takes, perhaps tween the two will render with a more processor time than RADIUS variable number of faces, on a slid- and RESOL but is more powerful. ing scale between 6 and 36 – similar to my example of the sliding scale Note of Warning – RESOL, TOLER and RADIUS cancel each other out RESOL command above. RADIUS cannot be higher than 36 if used, so decide which one you faces, so for very large curves com- want to use for a model, or for a bined with small ones, use TOLER. component of a model.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

More 3D Commands C

ONE is like a cylinder in which the radius can be varied at the top and bottom. It also includes a cutting command, to decide if the top should be cut square (90,90 degree cuts) or cut like a ship’s funnel, at an angle. The angles are always cut along the X-axis, and must be positive.


!CONE demonstration !Syntax:- CONE height,radius1, ! radius2,cut1,cut2 CONE 0.2,0.06,0.03,90,90 ADDx 0.15 CONE 0.2,0.06,0.03,40,140

The number of faces on a Cone can also be controlled with the RESOL command

LBOW is for a curved tubular bend

object. It always grows up the Z-Axis, following the course of the X-Axis. The alpha angle can be anything from 0 to 360. The number of polygons can be a problem – the curvature can be controlled with the RESOL command. This is an important issue – if you have a low resol, the curvature of the tube looks unfortunately angular. However, if you set a high resol, you have too many surfaces on the elbow, and it will take too long to render. The best solution to the resolution problem with the ELBOW is to use the RADIUS command – in which you separate the resolution of the surface of the tube itself from the resolution of the curve that it follows. If the ELBOW is very large, use TOLER. Later in the Voyager course you can learn how to make curved tubes using TUBE, but this requires a lot more experience.

The illustration of three ELBOWs shows what a clumsy tool is RESOL. The Elbow can become sadly polygonal, or even straight. Use RADIUS. !ELBOW Demonstration !Syntax:- ELBOW rad1,alpha,rad2

ELBOW 0.12,90,0.03

‘alpha’ is the sweep angle of the Elbow. !ELBOW Demonstration !Syntax:- ELBOW rad1,alpha,rad2

ELBOW 0.12,90,0.03 RESOL 12 ADDy 0.1 ELBOW 0.16,90,0.04 RESOL 6 ADDy 0.1 ELBOW 0.20,90,0.05 DEL 2

END and Line numbering


ND is one of the first things I write, after I have written a Title of the object, the Date and my Name. It is because everything in front of END is the 'Executive script' and everything after END is going to be a useful Subroutine that needs to be stored until used. Even the most complex of objects need be no more verbose than the example here. It is immensely easier to detect errors or make changes if the script is written as subroutines. Put a line of dashes after the END statement.


!Swivel Chair !3D Script PEN 7 GOSUB 50:!Error Checking GOSUB 300:!Foot of Chair GOSUB 400:!Vertical Shaft GOSUB 500:!Seat GOSUB 600:!Back END:!----------------50:!Error Checking IF height>0.9 THEN height=0.9 RETURN 300:!Foot of Chair !etc etc !...........


INE numbers are always written with a colon (e.g. '250:'), and should be followed by a text comment label (e.g. '!Chair legs'). They do not have to be in sequence, but it helps you if they are. Early forms of BASIC required a number on EVERY line, which is why numbers were spaced with large increments e.g. 10:, 20:, 30:, 40: etc. – enabling you to insert extra ones later. Now you have freedom to write without numbers. When you use subroutines, there is nothing to stop you using large numbers like 100:, 1000:, or 10000: – they are merely labels.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

The Good Chair Make your first simple chair into a PARAMETRIC object


HE very simple chair was an example of GDL that works – but it isn’t smart, isn’t parametric, and isn’t structured. So let’s look at ways of improving it. In so doing, you will learn the primary techniques in making GDL move from Object-making to Tool-making. First, we will make it parametric. Click on your simple chair, and ‘Open Library Object’, and you get the main parameter building window (as right for v 6.5). You can make new parameters by clicking the ‘New’ button. These will give you new parameters of Length, named C, D, E, F and so on. Create parameters and change their Variable names to sensible ones like ‘fsec’ and ‘shigt’ according to the parameter table here (right). The Name here is what the User will see when using the dialog box that you are now creating. Put in nominal Values for each parameter. In this example, they are in decimal inches. You must decide whether a parameter is a Dimension, a Number, a Material, a Pen colour or whatever. Do this by holding the mouse down on the small symbol; the selection palette pops up, and you can select one type. Only use ‘Length’ for dimensions, because ArchiCAD changes these according to your dimensional system settings. For numbers which remain constant, use ‘Real Numbers’ or ‘Integers’. For materials, use the little cube and sphere logo. The others you will use more as you progress with GDL.

3D Script Take the 3D script of the Simple chair, and change all the 2” to ‘fsec’ (frame section). Continue to work through all the dimensions changing them to parameters. As a design improvement, let’s make all the legs the same !Simple chair height, and then have the !3D Script Mark 1 chair-back permitting an MATERIAL "Whitewash" inclination angle, so the PEN 7 leg components of the !Legs BLOCK 2",2",18" back of the chair gets writADDx 16" ten when we do the back. BLOCK 2",2",18" ADDy 16" Because the seat height is BLOCK 2",2",30" ‘shigt’, the height of all the ADDx -16" legs is ‘shigt–fsec’. Do a BLOCK 2",2",30" DEL 3 similar small calculation !Seat for the width and depth ADDz 18" ADD commands, allowing BLOCK 18",18",2" DEL 1 for the frame thickness. !Back Delete the PEN comADD 2",16.5",24" mand – for simple objects, BLOCK 14",1.5",12" DEL 1 !Back to origin the user can set pen colour in the Settings dialog box. Leave the 2D script as before, with the PROJECT2 or the RECT2 routine. We will return to this chair later to work on the 2D script and to learn about Subroutines.

Parameters can be: Dimension (based on your system preferences, metric or imperial), Angle, Real number, Integer, Boolean choice, Text, Material, Line type, Fill pattern, Pen colour, Separator (white space), or Title (bold font).

!Simple chair Mark 2 !3D Script !GDL Discovery Course !with Parameters

We are using A and B for the chair, so convert A and B to wid and dep early in the script

wid=A !Width dep=B !Depth p=1/25" !One pixel [or it can be 1 mm]

Note that the use of ‘p’

!Legs for a pixel of 1 mm MATERIAL lmat saves having to type BLOCK fsec,fsec,shigt-fsec 0.001 all the time. By ADDx wid-fsec BLOCK fsec,fsec,shigt-fsec shrinking the size of the seat by 1 ADDy dep-fsec BLOCK fsec,fsec,shigt-fsec millimetre (1/25”) we avoid a rendering ADDx -(wid-fsec) BLOCK fsec,fsec,shigt-fsec problem between seat and legs DEL 3 !Seat MATERIAL smat ADD p,p,shigt-fsec Here, we move BLOCK wid-p*2,dep-p*2,fsec into position, DEL 1 rotate the !Back cursor, then do ADD 0,dep-fsec,shigt-fsec the upper legs ROTx -recang and the back as MATERIAL lmat one operation, BLOCK fsec,fsec,bhigt-shigt changing ADDx wid-fsec Materials as we BLOCK fsec,fsec,bhigt-shigt go DEL 1 MATERIAL smat ADD fsec,0,(bhigt-shigt)/3 BLOCK wid-fsec*2,fsec,(bhigt-shigt)*2/3 DEL 3

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Tubular Handrail E

ARLY on, it’s good to take a break from the tyranny of BLOCK, and try something a bit more elegant. In this library object we look at: • Handling cylindrical entities – CYLIND and ELBOW • Using RADIUS to control curve smoothness • Using HOTSPOTs in 2D

Parameters Ask the user to enter small dimensions for tubing in the form of Diameter, not in Radius. People always think of handrails and other round things in ‘diameter’. Your program can easily convert Diameter to Radius. As the handrail dimensions can be altered, A and B are not used in this script or in the parameters box – but they could be.

The handrails can be grouped together to form useful structures which would be difficult to do in any other way.

Angle – You can think of the angle in terms of the angle formed by two lines. But a tube bender, or GDL prefers to think of the ‘sweep angle’ formed by the tube, from the straight. Radius – You want the main curve to be as smooth as possible, but don’t want the surface of the tubing to have 36 faces as it will take too long to render. The RADIUS command allows you to control the surfaces of small and large curves, and to relate it to the actual tube radius. (See RADIUS in the explanation of curvature and in the GDL Manual.) It is confusing that GDL uses the word RADIUS for this purpose, but we have to live with that now. When you only want to control one set of surface curves, such as for cones or cylinders, you can use the simpler command RESOL. PEN and MATERIAL – If you make the material zero, then the PEN colour will make the whole surface to be that colour. If you want to ‘hand’ the finished handrail, i.e. Mirror it, then you can do that in the object settings box, later.

!Curved Handrail system !3D Script Mk2 trad=diam*0.5 !TubeRadius RADIUS trad*0.5,trad*4 !prelims MATERIAL matl PEN pcol !Make it! ROTx -90 CYLIND len1,trad The Origin for this ADDz len1 Handrail starts ELBOW radc,angb,trad drawing the tube ADDx radc ROTy angb from one end, and ADDx -radc proceeds to ‘worm’ its CYLIND len2,trad way around the bend, DEL 5 along the tube. END:!------------------

Help files + Documentation folder

Dimensional settings



T is most helpful with ArchiCAD 6 that the manuals are now available on-line in the Documentation folder, in your ArchiCAD folder. In fact, you can write any document yourself, save as Acrobat file, and put it in that folder. They appear in the HELP menu. The search command with Acrobat makes it easier to use the GDL manual (easier than the paper version!) So it may be easier to enjoy using your GDL manual. You can put the GDL Cookbook.pdf into the Help Menu.


VERYBODY works in different dimensions depending on their country and regional building standards. The First Chair was hard coded (written into the script). The slightly Better Chair was in imperial. This Tubing above is in metric, in metres. Quite a lot of the exercises here are in metric, in millimetres. If you are not sure, open a NEW Library object and look at A and B. If A is 1.00 you are in metres, and if A is 1000 you are in millimetres. You have to have a project file open in the background while you work in GDL to get the navigator palette to work correctly, and to set the dimensional environment. If you modify dimensional settings remember to set the number of decimals you can display.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Tubular Handrail: continued

3D Script Convert the diameter to Tube radius. Issue the RADIUS command based on trad. Set the Material and Pen colours. Starting from the end of the first tube, use a ROTx 90 to lie the handrail down horizontally (or it will grow upwards). Do the first Rail by pushing out a cylinder horizontally, then move to its end by adding along the Z axis – which is now horizontal. You can push the ELBOW round the corner, as it grows along the Z axis, which is already in the right direction. Then go round the bend – go to the centre of the curve, rotate by the angle, and move to the start of the second tube. Push out the final cylinder. This script is too short to justify a strict approach to structured programming, but you should still use the DEL command to bring your 3D cursor back to the origin before writing END. Using the principles of the script for this simple library object, you can assemble handrail and tubing structures of great complexity. If you used A and B to make it stretchy, you would have to work backwards from the curve radius to decide what the straight tube lengths would be. Notice how the cursor movement commands are indented. When you have a long run of them, it makes it easier to count them up.

!Handrail 2D script PROJECT2 3,270,2 HOTSPOT2 0,0 !First Tube ADD2 0,len1 HOTSPOT2 0,0 !Round the bend ADD2 radc,0 ROT2 -angb ADD2 -radc,0 HOTSPOT2 0,0 !Second tube ADD2 0,len2 HOTSPOT2 0,0 DEL 5

2D Script As the user can change the handrail details, you cannot use a standard symbol. You need to write a 2D script. For quick-to-draw objects, issue the PROJECT2 command as here. Hotspots: This handrail is a slippery object to pick up because the ‘Bounding box’ hotspots are going to be positioned well away from the actual rail. You need to plant HOTSPOTs in the 2D script. Turn off Bounding boxes. The 2D cursor can be moved about in a similar way to the 3D script, using the ADD2 and ROT2 commands, until you find the end of the tube.

Tips and Tricks Advice Corner for GDL newbies on 4/7/00, Sarah Elliott (Graphisoft_HU) wrote: What are the most important things you tell the people who attend your GDL classes about object making?

DNC Replies: I tried to think of three, but could only think of five! First thing is.... •Dont Panic!!• Its not as difficult as you expect once you are into it, and when you get an error message, read the message, look at the script; have you spelt the parameters right? Are your commas in the right place? Try excluding part of the script to see if other parts work. GDL has few bugs, for beginners; there are none to speak of; so its a relief to know that the error will be found through hard logical thinking. Second thing is.... •Always have pen and paper handy• If you can't draw it on paper, you can’t write it in GDL. Drawing it out on paper will put your mind at ease to concentrate on the logical process of actually building it. For many commands such as prisms and revolves, half the job is done if you have drawn it out, preferably marking the origin and numbering each point along the profile.

Third thing is.... •Think in parameters• Always try to work (and think) in parameters not in numbers – its easy to develop your own lingo of 'wid', 'dep', 'len', 'hit' and 'thik', and easier to write in these terms knowing that a simple change in the parameter value will modify your object easily. Fourth thing is... •Steal from ArchiCAD• Some objects are so complex that the parametric method above is harder than beating your head against the wall. You may be better sketching them out in the ArchiCAD floorplan and then dragging them and dropping into the script. You may have to settle for making them parametric by stretching and mirroring. Fifth thing is.... •Structured GDL is best• The moment it gets more complicated than one page full of script, convert the script to subroutines, so that each part of the model is a tiny object in its own right. This also saves on repetitive typing, and makes it easy to isolate errors. First published in Graphisoft Newsletter, Summer 2000

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

So, What is Structured Programming?


N the context of GDL, it means taking a very disciplined approach to model building, in particular these three rules


NALYSE the model to un derstand all aspects of its symmetry, repetition and essential geometry.


RGANISE the script into a number of subroutines that reflect the 3D organisation of the object.


AINTAIN strict control over the location of the 3D cursor. Return to the origin after each operation.

Why use Structured Programming?


OR SMALL MODELS, you can write BLOCK this, CYLINDer that, CONE the other and finish up with simple models – the scripting may not be elegant, but it works. However, if you make the model bigger, you will produce a script of spaghetti-like complexity. If you structure your 3D script with more discipline, you can build models of great complexity without losing track of what you are doing – and you are able to repair it or amend it without despair. Professional programmers despise BASIC because they associate it with amateurishly written, unstructured code, that only just works, that cannot produce merchantable applications, that can only be debugged by the original writer, and so on. The virtue of systems like PASCAL, LISP and ‘C’ is that programs are 'object oriented', modular, structured, and so on. Perhaps this is why AutoCAD uses Lisp, and why MiniCAD uses PASCAL for their equivalents of GDL. But listen! BASIC, as used in GDL, does everything that is needed to produce 3D objects, and is perfectly capable of being written in an 'object oriented', modular, structured way, that can be debugged by other people and which can produce library objects that are of merchantable quality. It's just the way you do it!!

3D Model Analysis


CRIPTING is easier if you understand the 3D nature of the object. All that really matters is that you analyse the object accurately, which you must do regardless of the language you are using or thinking in. For architects and designers who are in the business of 3D, this should be the easiest part.

The universal language of 3D is the 3D primitive – the Block, Cylinder, Cone, Sphere, Extrusion etc. Slab shapes are flat blocks, and wall shapes are tall thin blocks. At the next level of 3D interpretation, you have slabs which curve, holes drilled, surfaces rounded or chamfered, extrusions taken through curved or angular pathways, saddle shapes, lathed objects, elements repeated around axes, and many such variations. At yet another level, you must identify elements which might change, like lights which come on, elements that must be able to slide or rotate, or to disappear if they are too detailed, which might need random numbers, or do something special. Think these out on paper: if you cannot draw the object freehand in pencil, then you probably cannot script it.

Origin and 3D Cursor


DL gives you a 3D Cursor – a bit like the blinking cursor in Word or Excel. Whatever you type will appear where the cursor is blinking. In GDL, if you move the cursor 2 metres upwards, and rotate it by 45 degrees, then the next thing you type will occur there, at that angle. Likewise, every model has an Origin – it’s like the ‘top of page’ in a word processing document. As a result of your ADD, MUL or ROTate commands, the 3D cursor departs from that origin; you can then draw an object, and then either goes on to draw something else, or you return it to the origin. If you want to keep control of the model, you need to return to the origin before you tackle the next part of the model.

Look at the scripts in the GDL Cookbook, and you will see a constant reiteration of the value of Structure in programming 1.16

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

These need thinking about... • What investment value does your object really have? Will it be used once, for your eyes only, or could it be used dozens of times in coming years by many people? Imagine someone else using the library object, and ask yourself, which aspects of the model really need to be parametric? What happens if the user enters negative quantities or angles? How many choices should the user be offered? • Where should the model origin be? This is the point that usually defines the object’s height and location in the project model. It would help if it was at a centre of symmetry or rotation. Can you take advantage of symmetry? – you could build half or quarter the model only, and then multiply or mirror the rest. • Can your object be subdivided into ‘tasks’ or elements? Take a swivel chair: this has axes of symmetry, elements which repeat themselves, elements which are clearly lathed round an axis, elements which curve or twist, elements which hinge or bend. If you modify parameters such as length and height, do elements which elongate also have to thicken? Will they then become larger than the element they join on to, or punch through it? Is there a logical sequence to the assembly? Do the elements have ‘sub-elements’? For example,with the Swivel chair, you have: multi-toed foot (with coned floorpads), central shaft (with adjusting handle), swivelling upholstered seat (nice and curvy), upholstered backrest (also curvy), and support for the back rest (metallic with adjusting handle.)

• Are there hinging or sliding elements? In how many planes do they hinge or slide? Is there a succession of moving elements, such as in the human arm? (in which, you get rotation as well as hinging!) • What elements are repetitious and can be done with loops? Are some quantities unknown? Perhaps they will be generated after the user has entered a parameter – e.g., the number of rungs of a ladder depends on the height and slope of the ladder, assuming a regular spacing. • Which commands (in GDL) would best achieve the result? If you analyse the model into primitives, are the elements formed from cylinders, cones, prisms, tubes, extrusions, cut objects, blocks or spheres? There are frequently more ways than one to ‘cook your fish’. • What maths or circle geometry problems are involved? How may arcs or circles are there, and can you locate their centres, and calculate their radii? Are curved shapes circular, elliptical or parabolic? • Can you estimate the required ‘level of detail’ accurately? Do you really need to show planar glazing fittings, or handles on the doors? Could you get away with using 2D elements in the 3D model? Is your level of detail (LOD) likely to generate too many polygons? • Are you planning to animate the model at some stage? If so, is it worth considering writing objects that hide themselves or reduce their level of detail when the camera is a long way away??

PEN PEN sets the pen colour. This can be changed during the execution of the script, so that different parts of the model can be drawn separately. On PEN, there are some points to note: PEN must have a value. You cannot have PEN zero. PEN 1 gives you Black line in AC6.0 and earlier, but you need PEN 7 for black in AC 6.5 – an immediate illustration of the benefit of making your object parametric. Another good reason is that people can modify the PEN palette and the pallete values can be re-assigned in colour and line thickness. This can have mischievous effects on your model. It is best therefore not to hard code the PEN colours, but to make them parameters so that the user can select them.

Comma confusion? In some countries, it is common to write decimal points as commas e.g. 1,25. In other countries it is common to write thousands with commas for example, a million is 1,000,000. If you have a localised ArchiCAD, this is how numbers may

It is not essential to set Pen colour for simple objects as the pen colour can be set by the user in the main Object Settings dialog box. But if the object is complex make use of the PEN command to control appearance of different parts of the object.

Material obtained from Pen PEN can be used as a convenient way to create bright coloured surfaces. If you set MATERIAL to zero, then the PEN colour becomes the surface colour. This is why most of your first efforts at modelling come out as GREEN, BLACK, PINK or another colour – the material is becoming the same colour as the default pen colour if no material has been specified. appear in the parameters box. But in GDL, the scripts are hard coded so only one convention can be followed. Dots are used to form the decimal point, and commas are used to separate numbers. Many of the errors in your early efforts in creative GDL will be with misplaced dots and commas. Be rigorously careful with them.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

About Subroutines... T

HE essence of structured programming in GDL is that 3D models should consist of subroutines which reflect the 3D nature of the model. The other point of using subroutines is to avoid ever having to type out complex GDL commands more than once.

Re-read these rules frequently when your first attempts do not work correctly!

The example here is what you should be aiming towards. Every GOSUB command is telling GDL to GO and run the SUBroutine of that line number.

The ‘Executive Script’

The ‘Subroutine’



HE first part of the script (as far as the END statement) can be called your ‘executive script’. This is the main controlling script, that decides on what will be drawn, and in what order. When GDL reaches the END statement, it stops. After the END statement, you carry a lot of useful baggage, called Subroutines. Each element of the model could be a subroutine. They can only be used if they are called by the executive script, or by another subroutine. The END statement prevents them from being read accidentally. It is a good idea to keep the executive script short and decisive. When you want to repair, modify or extend the model, you will know exactly which subroutine to go to. For further reading on the syntax of BASIC, it is worth considering getting a book on BASIC. Although these are probably more difficult to find in the 21st Century than books on C++, there must be some in libraries and well stocked bookshops. If not, you will have to learn from the GDL Cookbook!

HE subroutine is a short portion of script that performs an action, and then finishes with the command RETURN, which tells GDL to go back to the GOSUB command that it came from; and then to continue with the program. Subroutines live in the region following the END command. A subroutine starts with a number so that you use that number when you write the GOSUB command – e.g. GOSUB 200. The subroutine should behave like an elemental object in its own right. If you want to move the element sideways, or swivel it, you apply those move or swivel commands to the cursor, and then GOSUB the subroutine. Here is a typical subroutine, numbered 250: The number must always be followed by a colon and you should add a comment line after the number, so that you know what the subroutine is actually doing. In each subroutine, there must be exactly the right number of DELs to ensure that the cursor returns to the same place as it was at the start of the subroutine.

!Swivel Chair - 3D executive script GOSUB GOSUB GOSUB GOSUB GOSUB END

250:!Two Spheres subroutine SPHERE 0.1 ADDx 0.2 SPHERE 0.05 DEL 1 RETURN A typical Subroutine

50 !Error Checking 300 !Foot of chair 400 !Shaft of chair 500 !Seat of Chair 600 !Back of Chair A typical Executive Script !-------------

Golden Rules for Subroutines! • Subroutines are always written after the END statement. END is essential – you must never accidentally run from the executive script into the subroutines. • Subroutines always start with a Line Number, and finish with the statement ‘RETURN’, otherwise, GDL will accidentally run into the next subroutine. • The subroutine must be entirely self contained – the 3D cursor must finish up exactly where it was at the start of the subroutine. So you DEL all the ADD, ROT and MUL commands within the Subroutine. Never use DEL TOP for this purpose. 1.18

• Never GOSUB the subroutine you are already in, or GDL will go on trying to do this for ever (Cmd-period to stop). • Never use a GOTO command to jump out of a subroutine – you will get quite lost! • Subroutines can GOSUB other subroutines: For example, in the human body, an Arm is an object written with a subroutine; but the Arm will need another subroutine to draw the object called Hand, and the Hand will need one for each of the objects called Finger. • The 2D, 3D and Properties scripts can use Subroutines; but do not jump to one in another script from the one you are in! Note, You cannot use END or Subroutines in a Master Script.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Converting a script into subroutines !Simple chair Mark 3


!3D Script IND the Simple !Simple chair Mark 2 !GDL Discovery Course chair we made ear- !3D Script !Using Subroutines lier. We shall try to ‘struc- !GDL Discovery Course wid=A !Width ture’ it. The first practical !Using Parameters dep=B !Depth step to making your script wid=A !Width p=0.001!One millimetre pixel !Depth modular (or structured) is dep=B GOSUB 100:!Legs GOSUB 200:!Seat to learn how to use subrou- p=0.001!One millimetre pixel GOSUB 300:!Back tines. 100:!Legs END:!-----------------------Here, we try changing MATERIAL lmat BLOCK fsec,fsec,shigt-fsec 100:!Legs the script from the raw (but ADDx wid-fsec MATERIAL lmat parametric) script into sub- BLOCK fsec,fsec,shigt-fsec BLOCK fsec,fsec,shigt-fsec ADDy dep-fsec routines. It is an easy proADDx wid-fsec BLOCK fsec,fsec,shigt-fsec BLOCK fsec,fsec,shigt-fsec gressive change. ADDx -(wid-fsec) ADDy dep-fsec First number the groups BLOCK fsec,fsec,shigt-fsec BLOCK fsec,fsec,shigt-fsec DEL 3 ADDx -(wid-fsec) of commands. Each one BLOCK fsec,fsec,shigt-fsec will become a subroutine. 200:!Seat DEL 3 Make sure that in each MATERIAL smat RETURN ADD p,p,shigt-fsec group, the number of DELs 200:!Seat BLOCK wid-p*2,dep-p*2,fsec MATERIAL smat is right in that the cursor DEL 1 ADD p,p,shigt-fsec goes back to the origin each BLOCK wid-p*2,dep-p*2,fsec 300:!Back time. Use 100’s to increDEL 1 ADD 0,dep-fsec,shigt-fsec RETURN ment the numbers of your ROTx -recang MATERIAL lmat 300:!Back groups. BLOCK fsec,fsec,bhigt-shigt ADD 0,dep-fsec,shigt-fsec Next, put in the END ADDx wid-fsec ROTx -recang BLOCK fsec,fsec,bhigt-shigt MATERIAL lmat command, clearly marked DEL 1 BLOCK fsec,fsec,bhigt-shigt with a comment marker MATERIAL smat ADDx wid-fsec and a row of dashes. This ADD fsec,0,(bhigt-shigt)/3 BLOCK fsec,fsec,bhigt-shigt DEL 1 signifies the end of the main BLOCK wid-fsec*2,fsec,(bhigt-shigt)*2/3 DEL 3 MATERIAL smat part of the 3D script (the ADD fsec,0,(bhigt-shigt)/3 ‘executive script’). BLOCK wid-fsec*2,fsec,(bhigt-shigt)*2/3 DEL 3 What follows now is a series of Subroutines which RETURN have to be called with a GOSUB command. Put the word RETURN at the end of each subroutine. Now, in the Executive script, write GOSUB followed by the Line number and a copy of the name of the subroutine – do it as I have done here. If it doesn’t work (you get errors) it’s due to forget2D Script ting the colon after the line numbers, or forgetting Because the Chair is able to recline at different angles, END or RETURN. Perhaps you didn’t get the number it is more difficult to write a script in 2D and may be of DELs right. Go over my example until you get it easier to just use PROJECT2 3,270,2. You would need completely right. trigonometry to work out where the back appeared in Whenever you are in doubt, go back to the page on the 2D plan. Put in A-B Hotspots as shown, and your Subroutines, and thoroughly check through the chair will become S-T-R-E-T-C-H-Y! Golden Rules on Subroutines.

Improving the Seat routine In the Simple chair there is an unpleasant clash of materials for seat and leg at the rear of the chair. The routine with ‘p’, a one millimetre ‘nudge’, improves the appearance.

!Chair - 2D-Script HOTSPOT2 0,0 HOTSPOT2 A/2,B/2 HOTSPOT2 A,0 HOTSPOT2 A,B HOTSPOT2 0,B PROJECT2 3,270,2 !The object!

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The four main ones are for stretching, and the middle one is for picking up


The GDL Cookbook 3 – Discovery

IF... THEN... ELSE... ENDIF Or.... how machines make decisions


HEN we talk about ‘pro gramming’ we are often thinking of the ability of our script to tell the computer to follow a path, make decisions, follow courses of action based on those decisions or upon pre-ordained rules, and thus display a level of ‘articifial intelligence’. The IF statement is the essential mechanism by which computers make decisions – whichever language they are working in.

IF statements can stay on one line, or can refer to a long sequence of commands. Examples are given here. ENDIF means that it has reached the end of the long version of the IF statement. ELSE Finally, you could have two complicated tasks to do, one if the IF condition is true, and the other if it is false. You use ELSE to help decide whether to do one task or the other. In this case, ELSE must be on a line by itself.

Nested IF Statements As the GDL parser encounters each IF... THEN, it remembers it, and as it encounters each ENDIF, it signs it off. So you can ‘Nest’ many IF.. THEN.. ENDIFs inside each other, and the machine keeps count accurately. You may lose count though, so I don’t encourage excessively complex nests.

IF s=13 THEN GOSUB 250

IF p>13 THEN n=1 ELSE n=0

This is the simplest example of an IF statement. If the IF condition is ‘false’ (i.e. ‘s’ is not equal to 13), then the program continues to the next line.

This is an extension of the IF statement; if the first IF condition is not ‘true’ then it will take an alternative course of action. In this example, one is setting a flag called ‘n’ to values of 1 or zero.

IF s=13 THEN ADDz 1.2 GOSUB 250 nq=1 DEL 1 ELSE ADDx 0.3 GOSUB 150 DEL 1 ENDIF

IF s>13 OR s<26 THEN GOSUB 250 IF nq=1 AND s<13 THEN GOSUB 150

Elsewhere in the Cookbook, you may find examples of ‘Nested’ IF... THEN... ENDIF statements – where one entire IF... ENDIF statement is inside another. You may also find examples, as above, where a ‘Boolean’ choice is to be made, using AND and OR. IF Curr<0 THEN IF closd=1 THEN PRINT "Holes not allowed" END ELSE closd=1 ENDIF ELSE IF Curr>=900 AND Curr<1000 THEN S900X=CurrX-OrX S900Y=CurrY-OrY ELSE IF int(Curr/2)%2 THEN IF int(Curr/64)%2 THEN StatusE=2 ELSE StatusE=0 ENDIF

Building Signage: putting a picture into the project Lennox Boyd wrote: I wish to place an external sign on a building. How is this done? Mike O'Brien <> writes: 1. Create a picture file as a pict file on the Mac, or .bmp on Windows (jpeg or tif will also be acceptable). 1.20

Long IF Statement In this example, there are so many things to do as a result of the IF statement that it can no longer fit on one line. So you leave the first line with a ‘THEN’ hanging off the end of the line. Everything on every line after that will then work if the IF statement is true. If the IF statement is false, GDL ignores the whole group, until it reaches the ENDIF statement – logically. If there is an alternative action required (in case the first IF statement is false, then you can use the ELSE command to make it do something else.

ELSE StatusE=1 This small chunk of ENDIF a script IF int(Curr/4)%2 THEN by one of the StatusP=-1 worlds most expert ELSE GDL artists, Oleg StatusP=1 Shmidt reveals how ENDIF IF Curr>=4000 AND Curr<=4100 THEN complex you can get GOSUB 4000 with nested IF... ELSE ENDIF statements SHX[PtCount]=CurrX-OrX SHY[PtCount]=CurrY-OrY SHM[1][PtCount]=StatusE SHM[2][PtCount]=StatusP PtCount=PtCount+1 ENDIF ENDIF ENDIF

2. Put your picture file into one of your library files and reload the libraries. It has to be in a loaded library to work. 3. Open the Library Object Settings box (doubleclick on the chair button). Select the ‘picture 65’ library object (in section 01 of the library objects) and type in the name of your pict file in the parametric place (called ‘picture file name’). 4. Place the library object on your floor plan. 5. Photorender. The picture only shows when you photorender. Otherwise the frame is empty, and you see a rectangle in 3D.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

BAD Chair example


F you are working at home, you may have looked through pages in the GDL Cookbook. Look at the script on this page, and CRITICISE! Come back to it later for another read when you have done more scripting.

Do not type this script in!!’s an example of the untidy kind of scripts you write when you first start writing GDL scripts.

Let’s notice the good point(s) first: • The script results in a chair! Therefore, it is not all bad!!

The side elevation shows that it still works, even though it is a bad script!


F you have been on the Lift-Off course, the principles of Structured Programming and good typography will have been explained to you by now.

! Tubular Steel chair ! badly written GDL Pen 1 ! Draw Legs block .03,.03,.45 block .45,.03,.03 addz .45 block .45,.03,.03 addx .45 roty 5 block .03,.03,.45 roty -5 addz -.45: addx -.45 addy .45 block .03,.03,.45 block .45,.03,.03 addz .45 block .45,.03,.03 addx .45 roty 5 block .03,.03,.45 roty -5 addz -.45: addx -.45 addy -.45 Material "Chrome" !Seat addz .48 Material "LimeStone" !Seat block .45,.48,.05 addx .44 addz .15 !Back roty 5 addy .03 block .05,.42,.28

!2D Script PROJECT2 3,270,2

This cookbook is all about learning to used ‘structured programming’ techniques. It is easier to learn from mistakes than from successes – so please look at the criticisms on this page when you have tried some scripts yourself. If you make mistakes with a sequential script like this, you get tangles like the one here – and you find it very difficult to disentangle the distorted framework.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

Criticism of Script • The script is ‘sequential’ instead of being organised into a modular structure. For example, in this script, the entire leg is written once, and then it is written all over again, nearby. This is wasteful, and difficult to edit later. The legs, being the same, should be repeated in a neater way, either using a LOOP or a SUBROUTINE. • The PEN colour should also be a parameter in case pen colour 1 is not what the user wants. • Make even more use of COMMENTS, INDENTS and CARRIAGE RETURNS in the script to make it easier to understand. Indents are used in this example, but there is no logic to them. Indent cursor movements. • The Model starts from the bottom left corner, although it would be better with a symmetrical object to start from the Centre line. • The material for the legs is specified after they have been drawn. They will turn out green! • The entire script is written in lower case. Although lower case is easier to read, it is more difficult to pick out commands from comments and variable, and it is therefore more difficult to edit the script. ALWAYS use •UPPER• case for command words and •lower• case for comments and variables. • The script makes occasional use of multistatement lines using the colon: – eg addy .03:roty -5 on one line. This is legal syntax, but is bad because you will have problems debugging the script. • It is bad to write numbers in the form .03. Always give low numbers a leading zero, e.g. 0.03. • It is not parametric. The script specifies all materials and dimensions very specifically – whereas you should provide the user with all the parameters they need in the dialog box. All these material names have changed in ArchiCAD 6.5 onwards, so they will not be recognised. • At the end of the script, no attempt is made to bring the cursor back to a final resting place at the origin. • Although the author brings the cursor back before beginning the next operation (most commendable!), there are far easier ways to do it; instead of wriggling backwards in reverse, use the DEL command. • PROJECT2 is quite legal in the 2D script but it is always better to try a real script with RECT2 and LINE2 commands. Also, you should add in some Hotspots.


The GDL Cookbook 3 – Discovery

Steps in 2D – Dimension Tool


OU might think the GDL Cookbook was only about 3D modelling – Not so! 2D scripting can be useful for practical work. This dimension tool is simply a dimension line with two witness lines, but it is stretchy (or you can type in the dimension) and allows Metric and Imperial, and a choice of tick marks. !Dimensioning Tool !2D script !Hotspots - Stretch&Pickup HOTSPOT2 0,0 HOTSPOT2 A,0 HOTSPOT2 A/2,0 HOTSPOT2 0,-B HOTSPOT2 A,-B

Parameters The Font size in millimetres is based •absolutely• on the plotting or printing size, and disregards the scale of the drawing. (You can buy a commercial dimension tool from the author which include autosizing fonts.) Here, we try using Boolean parameters, which allow a simple binary choice between OFF or ON. These are sent to the GDL script as being zero or one. A better solution is to use a Value list (Pop down menu) which we get onto in a few pages.

2D Script The Hotspots are key to making it stretchy. The IF... ELSE.... ENDIF statements illustrate how alternative actions can be taken. Note also that a line that ends in a comma is assumed to continue on to the next line. (I have to keep scripts narrow so they fit the page!) Finally, for the TEXT2 display, it is always necessary to define the font and style of the text, so this is jumping you ahead a little. Type it in as you find it for now, and have a look ahead at the pages in the manual and here on DEFINE STYLE. This method forces TEXT2 to display a number (signified by the ‘%’ sign) to be in Metres or in Feet+Inches, and the 0.8 forces it to a precision of 1/8”.

!Dim_Line & LINE2 0,0, LINE2 0,-B, LINE2 A,-B,

Witness Lines A,0 !Dim_line 0,B*0.2 A,B*0.2

!Dimension markers IF marks=0 THEN LINE2 -A/100,-A/100, A/100, A/100 LINE2 A-A/100,-A/100, A+A/100, A/100 ELSE CIRCLE2 0,0,A/100 CIRCLE2 A,0,A/100 ENDIF !Text DEFINE STYLE "diasty" "Geneva", fsize,5,0 SET STYLE "diasty" IF units=0 THEN TEXT2 A/2,0,STR('%0.8 ffi',A) ELSE TEXT2 A/2,0,STR('%m',A) ENDIF

PRINT PRINT is a way of getting GDL to tell you or the user something – used in pointing out errors, or in debugging. The warning box only shows when you display in 3D. My advice is not to use it unless you have a very important object, and a very important message to tell the user. If you do it for commonplace objects like windows, the user could be faced with 20 or 50 identical shouting warning boxes, and would not know which object was wrongly set.

slenr=colht/colwid !Slenderness Ratio IF slenr>24 THEN PRINT “Warning, Column Slenderness Ratio is:”,slenr ENDIF


Using the PRINT Command PRINT is most useful during the writing and debugging process, for example, to see if the result of a Trigonometrical calculation is giving the right result. Execution of the 3D script is halted at the Print command, so it’s a good way to test something even when it isn’t fully working. It’s also useful if you lack a pocket calculator capable of Trig or complex functions. Type in a quick expression and get the answer.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Tubular Steel Chair


ERE is a different chair – but rendered in round tubes – like the original Breuer chair. This chair is a useful starting exercise in • Handling straight and curved tubular sections • Keeping track of many 3D cursor moves • Structuring the program in the form of subroutines • Using Symmetry and Mirroring

Parameters Take a copy of the previous chair and let's change it radically – using cylinders and tubes – add some extra parameters for Seat thickness, Pen colour and a Boolean option to change the 2D view of the object. We are going to make the origin in the centre front of the chair, go out half a width, draw one leg, all in subroutine 100. Then repeat that on the other side (mirroring the first). Then finish off with the seat and back, all in subroutine 200. The steel of this tubular chair meets at the bottom. It could also do at the top, but I am trying to keep this simple!

Aim for this...

Master Script Use this now, for the first time. It’s for parameters etc. that are needed by both 2D and 3D scripts. ‘Crad’, ‘trad’ and ‘clen’ are examples of ‘internal parameters’. This means a parameter that is not changeable by the user in the normal dialog box. The best place for these is in the Master Script. The author of the script can tweak the value of ‘crad’. ‘clen’ is calculated on the fly.

3D Script To simplify matters, the curved bend radius ‘crad’ is 3 times the tube radius. We also add the RADIUS command to control the two curvatures of tube bend and tube surface. It dramatically shortens the time taken to render just one chair – imagine a lecture room or café filled with such chairs!

!Tubular steel chair !Master Script wid = A !<-these could be dep = B !<-in Master script trad = fsec/2 !Tube radius crad = trad*3 !Curv radius bhit = bhigt-shigt !back ht. sinr = SIN(recang)

!Tubular steel chair !3D Script PEN pcol RADIUS trad,trad*2 GOSUB 100: !Leg MULx -1 GOSUB 100: !Leg DEL 1 GOSUB 200: !Seat GOSUB 300: !Back END!----------------------

If you are a bit adventurous, you could try making a larger curve radius, leaning the front tubes of the frame, and closing the frame at the top of the back. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

Worm your way round the tube


The GDL Cookbook 3 – Discovery

Tubular Steel Chair: continued Axial Symmetry: Because of the symmetry of a round tube chair, you can see the great advantage of starting from the Centre Line, doing only one leg, and then mirroring that whole leg. The MUL command multiplies everything in the direction of the axis. So MULx -1 makes the leg draw itself. 100: Starting from the centre back of the chair, you ‘worm’ your way round the tubular frame, issuing Cylinder and Elbow commands as you go. Almost always, you have to issue a ROTz to get the next Elbow to grow in the right direction – it always wants to grow over the X-axis. The way of getting round the final corner is the same as for the Handrail. The height of the vertical leg cylinder is tricky, so it is calculated on a line of its own, then used as ‘clen’ in the script.

Upholstering the chair 200: and 300: The Seat is easy to place (BLOCK command) but the Back is more difficult. Maneouvring up to the right place for the Back of the chair (which rests *between* them) proves to be a bit tough. We could move in just three moves, not seven; but I advise you to keep your moves separate when it is this complicated. When you look at the script later, it is easier to see how the figures were arrived at.

200:!Seat for Cyl chair MATERIAL smat ADDx -wid/2 ADDz shigt-sthik BLOCK wid,dep-crad,sthik DEL 2 RETURN

This uses the same numbering system for the subroutines in the simple chair

100:!Cylindrical Leg MATERIAL lmat ADD 0,dep,trad ROTy 90 CYLIND wid/2-crad-trad, worm your way trad round the ADDz wid/2-crad-trad tubular frame ROTz -90 issuing ELBOW crad,90,trad cylinders or ADD crad,0,crad ROTy 90 elbows as you CYLIND dep-crad*2,trad go, and ADDz dep-crad*2 adjusting your ROTz -90 3D cursor at ELBOW crad,90,trad each junction ADD crad,0,crad ROTy 90 !(Work out cylinder height) clen=shigt-crad*2-trad*2-sthik CYLIND clen,trad ADDz clen ELBOW crad,90,trad ADD crad,0,crad ROTy 90 CYLIND dep-crad*2,trad ADDz dep-crad*2 ROTz 180 ELBOW crad,90-recang,trad ADDx crad ROTy 90-recang ADDx -crad CYLIND bhit-crad,trad DEL 18 RETURN

300:!Back for Cyl chair MATERIAL smat ADDx -wid/2+fsec ADDy dep-crad ADDz shigt-sthik+crad-trad ROTx -recang ADDz bhit/3 BLOCK wid-fsec*2,sthik, bhit*2/3-crad DEL 5 RETURN

All these ROTs and ADDs ar e necessary to get the cursor to the right position for the chair back.

2D Script If the chair was not stretchy, you could do a PROJECT2, place the chair on the plan, Explode it, copy the lines and arcs, and paste into the 2D Symbol window of the chair. To be sure of it working, type FRAGMENT2 ALL,1 into the 2D Script. This is because objects which have had a script and later have a symbol seem to steadfastly ignore this fact. ‘Fragment’ forces them to pay attention. As the user can change the chair style and size, you need to write a short 2D script. For quick-to-draw objects, just issue the PROJECT2 command as here. You need to organise a ‘nest’ of Hotspots at each corner and one in the middle to make sure the chair will stretch correctly.


!Tubular steel chair !2D Script PEN pcol HOTSPOT2 -A/2,0 !Stretchy HOTSPOT2 A/2,0 !hotspots HOTSPOT2 -A/2,B HOTSPOT2 A/2,B HOTSPOT2 0,B/2 !Pickup PROJECT2 3,270,2

This is a classic ‘stretchy script’ for almost any object. Other objects may have their origin in the centre or the corner, so you can adjust the A and B references in the Hotspot statements.

2D True View using Project 2

2D Scripted View

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Refinement of the 2D script A properly written 2D Script may take longer to write, but for a complex or and investment object, it saves masses of time in the redraw process of the project plan – this is especially important with furniture. Boolean Choice: If the user decides to have a true plan of the object in the 2D symbol, they can opt for a True View, alternatively, they can have a simplified 2D scripted symbol. Create the ‘truvu’ parameter. The hotspots remain in the same place. But you now have a long IF statement allowing a choice: use a Project2 or draw the chair with easy 2D commands. For the scripted symbol, draw rectangles, for the legs and the seat; and one rectangle whose Y dimension is determined as the function of the back height and the SIN of the back slope. How does one know how to use Trigonometry to determine XY locations? Well the GDL Cookbook has reminders of easy trigonometry, which is all you need to know! It is best to do a diagram on paper of what you are trying to achieve.

!Tubular steel chair !2D Script we want this PEN pcol dimension: it is HOTSPOT2 -A/2,0 !Stretchy bhit*SIN(recang) HOTSPOT2 A/2,0 !hotspots HOTSPOT2 -A/2,B HOTSPOT2 A/2,B HOTSPOT2 0,B/2 !Pickup !PROJECT2 3,270,2 !Test IF truvu THEN PROJECT2 3,270,2 ELSE 100:!Legs RECT2 -wid/2,0,-wid/2+fsec, dep+bhit*sinr bhit MUL2 -1,1 RECT2 -wid/2,0,-wid/2+fsec, dep+bhit*sinr DEL 1 200:!Seat RECT2 -wid/2,0, wid/2,dep-crad 300:!Back RECT2 -wid/2,dep-sthik+bhit*SIN(recang)/3, wid/2,dep+bhit*SIN(recang) ENDIF recan g

Tubular Steel Chair: continued

When you get further, I advocate the use of POLY2 instead of RECT2, so you can define fill pattern and make the chair opaque in plan.

The wickedness of GOTO


OTO is something that I never use, as it the worst thing that you can do if you believe in the structured programming approach. You can issue a command such as: ‘GOTO 250’, and it will jump to that numbered line. It doesn’t care if the number is part of a subroutine, it doesn’t check as to whether it is already in a subroutine. It just jumps, even if it is illegal. Chaos can be the result. GOSUBs are OK because they return after they have completed; they remember where they came from. GOTOs have no way to return safely; the execution of the programme carries on like a runaway horse. Early Graphisoft library objects are littered with dozens of GOTO’s, perhaps to discourage users editing the scripts.

Tips and Tricks Multiply, don’t Divide! Processors find it much easier to multiply than to divide. To divide once can take perhaps 32 cycles of a processors time, whereas a multiplication can take 1, 2 or 4 cycles, depending on which processor we are talking about, and whether it is optimised for floating point or integer. So although it may be easier on the eye to write an expression like 'LET len=wid*3/4', it may process faster in the form 'LET len=wid*0.75'. Seriously, the time difference would only matter on extremely long scripts. You are better off writing efficient code, by using polylines and clear structure.

The use of Subroutines, Loops and IF.. THEN.. ELSE commands should give you ways of getting round every possible situation where you might want or need to use GOTO. Before the FOR... NEXT Loop was invented, one could make something that behaved like a loop, using GOTO. But now, there should be no need for it in clean scripting. If the GOTO is going to a location so close that it is within ‘eyeshot’, i.e. when viewing the script the destination can be seen without scrolling, then I would reluctantly accept its use – just (if the numbering system was rational and sequential).

p=0 if p GOTO 1 PRINT "hello' 1:END

p=1 if p THEN 1 PRINT "hello' 1:END

You can even omit the THEN, or omit the GOTO – as long as one of them is present. But why am I telling you this? It’s just bad to use GOTO except in emergency.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

FOR... NEXT Loops The inexhaustible workhorse of GDL FOR k=1 TO n: NEXT k


OR non-programmers, the FOR... NEXT Loop seems at first perhaps the greatest challenge. It is in reality your strongest friend, because it has tremendous capacity for work. With a few economical lines of script within a FOR... NEXT loop, huge lattices or structures can be created. When you want to repeat an operation, there will be more than one way in which you can repeat it. Think of music. On your guitar, you can strum a chord ten times, at your own speed – so NUMBER is the controlling parameter. On the other hand you could strum the chord continuously until the conductor tells you to stop. Try changing the interval of the strum. In this case TIME is the parameter – the frequency of each chord, and duration of the total will determine how many chords get played. In the 3D world, DISTANCE can be FOR k=1 TO 4 CYLIND 2,0.2 !Pole ADDx 2 NEXT k DEL 4

a parameter – where spacing and total distance could decide how many floor joists get laid. In the FOR statement on the left, read it to yourself in slow, elongated english. Using a counter called ‘k’, for values of ‘k’ starting with 1, Do What Has to be Done, then go round again, incrementing ‘k’ by 1 to its next value until it reaches a value of 4. When ‘k’ reaches 4, you have finished, so continue to the rest of the script. NEXT: In every case, NEXT must be followed by the name of the variable. In a more complex model, you could have some FOR...NEXT loops nested inside each other, and it is important that GDL knows which loop you are referring to.

FOR dist=0 TO 3.0 STEP 0.5 ADDx dist CYLIND 2,0.2 !Pole DEL 1 NEXT dist

Let’s plant 4 poles at 10 metre spacing

Let’s plant an unknown number of poles



N this script we nominate ‘k’ to be a counter – the value changes from 1 to 4. Every time that GDL reads through the loop, it increases the value by 1. So the first time, k=1 and it draws the pole, moves sideways 10 metres, then encounters the NEXT k command. At this point GDL asks itself if ‘k’ has reached 4 yet. If it has not yet reached 4, it goes back to the first line, and runs through the loop again – until it finishes. As you have moved 4 times, you have to issue a DEL 4 command at the end to get back to the origin for your next action. As a matter of discipline, always try to use i, j, k, m, or n for loops based on round numbers (integers). Never use these variables for anything else, especially not Real Numbers like dimensions. If your loop is based on real numbers, use p, q, r, s or t, or something like ‘dist’. This tradition dates from the days of Fortran, but it is good, in that it reduces the risk of getting in a muddle.

LOOPS: Some Golden Rules • Loops can be based on Distance, Angle or Number. • Do not change the value of the variable that is being used as the counter or the end of the loop while in the loop. 1.26

E don’t know how many poles there will be – let GDL work that out for us – until we run out of road. We have three metres of road to plant. In this case, ‘dist’ acts as a distance dimension. Do not use ‘k’ here. It is best to associate ‘k’ in your mind with integer counters, not with ‘real numbers’. In the first run through the loop, ‘dist’ is zero, so the cursor moves zero, plants a pole, then returns to the origin – and then does it again with a new value of ‘dist’. For this, the loop needs to be told the ‘stepping’ rate of each cycle in the loop. If no stepping rate is given, it assumes you mean a value of One. Here, you want to step half a metre each time. As you have been using DEL inside the pole planting loop, you do not need to finish with a DEL. Moreover, you do not need to worry about how many poles to plant. When it has planted 7 poles and reached a distance of 3.0 metres, it realises that if it plants another, it will go to 3.3 metres, which is too far. Therefore, it stops at 3.0 metres run. • Once you are in a loop, you must never branch out of it, except to use a Subroutine. GOSUBs are perfectly safe. GOTO commands are quite forbidden, unless you go to a label inside the loop. • If you don’t know exactly how long the loop will be, use REPEAT... UNTIL, or WHILE ... DO... ENDWHILE

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Other types of Loop REPEAT...UNTIL / DO WHILE OTHER commands related to loops are REPEAT...UNTIL, and DO WHILE and WHILE... DO... ENDWHILE. I have found REPEAT... UNTIL to be the best way of running a loop where only a trial-and-error approach will work. For example, if the end value of the loop is constantly changing (if it’s generated as a random number) or you want to go on doing something until you exceed a certain value, then use REPEAT...UNTIL.

Alarm note! If you use a variable for STEP in FOR... NEXT and forget to give it a value, the loop will be stepping zero each time. ArchiCAD may never recover. Alt-Ctrl-Del will be your friend!

Example of REPEAT UNTIL: In Music, you might be playing something very modern where you strummed the guitar at random intervals – and finished after a fixed time of twenty minutes. This is a REPEAT UNTIL loop. Everybody will be very grateful when 20 mins is up. Every time you played the piece, the total number of chords played would be different and could be counted. Staying with the Music, WHILE... DO occurs while a value remains unchanging, and if something happens that changes that value, then you can escape from the loop. For example, while people stayed to listen, you could play. You can’t forecast the rate of walk out. But play you do WHILE the audience stays.

Stretchy Beam Tool


HIS is a useful little object that I give to my students, and it makes 3D modelling in ArchiCAD almost as easy as using good old ModelShop of years gone by. It is simply a stretchy rectangular object that can be dropped into the plan, stretched into shape, set material and height. Put several of them together, save them and you have a new Library object without having to use GDL! It’s a great way to knock up pergolas, frames, furniture etc. – easier than using Slabs and Walls. I made a glass Elevator car entirely out of BeamTool – with lots of detail – and a group of my students built an entire timber framed house!

Main value of this exercise: • To make things stretchy – do this whenever possible. • Using a dual 2D script – If it is difficult (tilted) THEN use PROJECT2, ELSE when it is easy (untilted) use a 2D script.

3D Script Do it with BLOCK. If you wanted to be able to vary the top, side and bottom colours, you would have to do it with a cPRISM command.

2D Script The HOTSPOT commands give the object stretchiness. When the object tilts, you can no longer use RECT2 so you use an IF...ENDIF statement to generate a PROJECT view of the object.

!Beamtool !3D-Script MATERIAL bmat PEN bpen ROTx tilt BLOCK A,B,higt DEL 1

End note If you do this with SLAB instead of BLOCK, you can turn it into a Rafter tool, with sheer edges.

SLAB 5,higt, 0,0,0, A,0,0, A,B,B*SIN(tilt), 0,B,B*SIN(tilt), 0,0,0

!Beamtool !2D-Script HOTSPOT2 0,0 HOTSPOT2 A,0 IF tilt THEN PROJECT2 3,270,2 ELSE RECT2 0,0,A,B HOTSPOT2 0,B HOTSPOT2 A,B ENDIF

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Stretchy Joist Tool This little joist tool is useful and the exercise demonstrates : • Making objects stretchy • An OBJECT becomes a TOOL • Using a FOR NEXT Loop to convert stretchy object into a multiple stretchy object


HE ArchiCAD Toolkit provides floor slabs, but these may appear too ‘plastic’ in nature. Even though the slab can contain a theoretical content of joists and insulation and boards, this is difficult to see on anything but sections. This joist tool object is for people who want their model to display visible structure. This is a development of the BeamTool that was in an earlier exercise.

MATERIAL jmat PEN jpen jlen=B BLOCK jwid,jlen,jdep

3D Script At the beginning of a new object, I tend to just knock something out that works before I introduce structure, and typographical formality. So this is a first stab at a script, where you get a single joist working. I recommend that you use quasi english variable names, hence the conversion of ‘B’ to ‘jlen’.

Parameters Think about the parameters that you would want your object to offer to the user. If you want the object to be stretchy, the overall dimension is the primary consideration; the actual number of joists will be worked out by your script. A and B are used for the plan area. The joist details are also entered. As this is a practical tool for building, you can offer an option to provide a final joist if the room is not an exact multiple of the joist spacing.

3D Script: continued: Now is the time to tidy up and formalise the script. First, put in the title, signature and date. Add some titles for sections of the script. Two more ‘Internal’ parameters are now needed. One is the actual number of joists in the object (this would be useful for properties scripting, but not needed for 3D). The other thing is to find out how much space is left after you have put in a ‘round’ number of joists, in case there is room to put in a final joist. This is simply ‘A’ minus the number of joist_spacings times the joist_spacing.

Use a FOR... NEXT Loop The joist we first put in can now be ‘wrapped up’ in a FOR-NEXT loop which spaces out the joists at the required spacing. Each joist is drawn, and the cursor returns to the origin before drawing the next joist – the Loop is stepping in Distance, not counting the joists one by one. 1.28

!Joisting/Boarding Tool !Discovery Course !Settings-------MATERIAL jmat PEN jpen !Parameters-----jlen=B numj=INT(A/jspa)+1 remj=A-INT(A/jspa)*jspa

Number of joists and the remaing space for the last joist

!Main Joists----FOR k=0 TO A STEP jspa ADDx k BLOCK jwid,jlen,jdep DEL 1 NEXT k

Note that on the first run through the loop it moves a zero distance, but as you have issued an ADD command, you still need the DEL command.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

IF.. THEN.. ENDIF This is an example of an IF.. THEN.. ENDIF, where there is more than one condition in the IF statement, and more than one line resulting from the IF statement. If the left over space is more than twice the width of a joist, then this routine puts an extra one in. The easiest way to do it with precision is to go to the end – to A – and then step back the thickness of one joist =A-jwid.

3D Assembly Now you can assemble quite complex groupings, and the JoistTool can also be used for floorboarding – in fact for any parallel, linear assemblies. Single joists, such as the trimmer here can be created simply by squeezing the JoistTool to the thickness of a single joist.

!Put in last joist IF finj AND remj>jwid*2 THEN ADDx A-jwid BLOCK jwid,jlen,jdep DEL 1 ENDIF

Space at the end needs filling – use this routine

ArchiCAD 6.x allows an degree of editing in 3D axo view, so it will become easier to use stretchy tools like JoistTool. You can use the sectional view to get parts of the assembly working perfectly.

2D Script You now have a 3D Tool that you can place into the Project Plan, and stretch to fit. But it must have a 2D symbol. Initially, your 2D script could be just PROJECT2 3,270,2 because the model is dynamic. If you leave it at that, it will work, but the Project Plan will slow down as the model size increases due to the time required to work out hidden line 2D Plan views of the 3D objects. I always script in 2D if it is going to be practical and time saving. Your object will not be properly stretchy unless you add the HOTSPOT2 script routine. Some objects are stretchy using the ‘bounding box’ hotspots. However the above script guarantees stretchiness, providing that A and B are used as dimensions.

End note The same tool can do vertical studs (posts), handrail verticals, rafter tools, fencing and floorboards. For a studding tool, to avoid confusing the user, you might use an almost identical script and store it in the library as vertical posts with different default parameters and preview window.

Hot Tip for rapid 2D Scripting Leave PROJECT2 in action until you are sure that your script works perfectly. In fact leave it there permanently, with comment marks. This is in case you need to edit or check the 2D script. • In fact, you can copy your 3D script and paste it into the 2D script window. Change the ADD x,y,z commands appropriately, to ADD2 x,y (throw away the Z value). ADDx and ADDy can be changed to ADD2. MUL can be changed to MUL2. Moves in the Z

!Stretchy Joist Tool !2D Script HOTSPOT2 0,0 HOTSPOT2 A,0 HOTSPOT2 A,B HOTSPOT2 0,B PROJECT2 3,270,2

!Stretchy Joist Tool !2D Script HOTSPOT2 0,0 HOTSPOT2 A,0 HOTSPOT2 A,B HOTSPOT2 0,B !!!!PROJECT2 3,270,2

Disable the Project2 once you get the scripted version working

jlen=B numj=INT(A/jspa)+1 remj=A-INT(A/jspa)*jspa

This 2D script uses the identical loops and structure to the 3D script, only some of the names are changed RECT is transparent, IF finj AND remj>jwid*2 THEN so if you want opaque ADD2 A-jwid,0 joists, use POLY2 with RECT2 0,0, jwid,jlen a white fill. DEL 1 FOR k=0 TO A STEP jspa ADD2 k,0 RECT2 0,0,jwid,jlen DEL 1 NEXT k


direction can be deleted if they will have no effect on the plan view. As there is no height in 2D, you can change a BLOCK command to a RECT2 command:- for example, BLOCK jwid,jlen,jdep becomes RECT2 0,0, jwid,jlen. Loops can use the same counters, and you use DEL to cancel Cursor movements just like you can do in 3D scripts.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Domino House: Loops


HIS Domino House type frame structure is a practical demonstration of the FOR... NEXT Loop. The resulting object could be used in site models to depict framed buildings surrounding your own (much better) scheme. FOR... NEXT is a way of achieving repetition without having to retype the script for the columns on each floor. Simply by setting a counter running, and then doing an operation every time that counter is incremented (until the counter reaches its end) you may finish with something very complex.

Doing it without Loops For example, in this script, you can build a two or three storey building by naming each slab, ADDzing to get to the next floor, doing another slab, and so on.

!3D Script PEN 1 MATERIAL matl depth=bdep*bays+clsz width=bwid*bays+clsz !Do one floor BLOCK width,depth,clsz !Do one column BLOCK clsz,clsz,ftfh-clsz !Jump a floor ADDz ftfh-clsz BLOCK width,depth,clsz BLOCK clsz,clsz,ftfh-clsz !Jump another floor ADDz ftfh-clsz BLOCK width,depth,clsz BLOCK clsz,clsz,ftfh-clsz DEL 2

3D Script: Reasons to do it with Loops This doesn’t sound too bad, but imagine doing it for all the columns on every floor! An even bigger benefit of the FOR...NEXT loop is that the loop can be parametric – so can the range of the counter and the stepping increment. In a building like this, there is so much repetition that you really will need to learn to use FOR... NEXT Loops to cope with the number of columns and floors involved.

Parameters Looking at this building, you can make every aspect parametric – the total width and depth of the building can be calculated in the script. Notice that in the parameter box, one takes care to ensure that things which are INTEGERs, such as number of Bays and floors are shown as Integers. The advantage of a parametric structure is simply that it can be any width, length, height, column size and spacing, floor to floor height. In an Urban Design model, this could be a good way to do surrounding buildings; better than trying to build them fully, or put them into the model as boring solid slab blocks. All one needs is an option to instal Glass to complete this model.

!3D Script PEN 1: MATERIAL matl depth=bdep*bays+clsz width=bwid*bays+clsz !Do onefloor BLOCK width,depth,clsz !Do one row of columns FOR k=1 TO bwid+1 BLOCK clsz,clsz,ftfh ADDx bays NEXT k Notice here how the cursor is left DEL bwid+1

FOR...NEXT Loops in action Look at the above way of doing a loop. If there are three bays in the building, you want to draw four columns. In this loop, you draw a BLOCK (which is the column); then you move the cursor, draw another block and so on, until they are all drawn. At the end of this process (see illustration), the cursor is hanging off the end of the building and you have to issue a DEL bwid+1 command to get the cursor back to the origin. 1.30

hanging past the end of the building.

Ghost Storey to print out? How do I get to show the Ghost storey on my printouts? 1. Copy the whole storey (what you want to see) 2. Paste to an empty storey 3. Select All and Explode (convert to 2D) 4. Set the Pen colours as appropriate (consider doing that before exploding) perhaps to very light grey. 5. Select All, Group, then Copy (or cut) 6. Move to storey you want to print, and Paste. Move to back. Alternative 5 and 6: Select All, Copy, create New Library Object, Paste into 2D Symbol window. Use that.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Another, neater way of doing a loop In the first loop on the previous page, the cursor worked its way from one side of the building to the other, drawing blocks and moving until it reached the end – like a creature laying eggs. I prefer a different method whereby the cursor always stays at the corner of the building, darts out to draw each column one at a time, and then darts back to the start; then darts out to do the next one – a bit like a chameleon’s tongue leaping out over increasing distances to catch flies!

!3D Script PEN 1: MATERIAL matl depth=bdep*bays+clsz width=bwid*bays+clsz !Do one floor BLOCK width,depth,clsz !Do 1 row of columns FOR k=1 TO bwid+1 ADDx bays*(k-1) BLOCK clsz,clsz,ftfh DEL 1 NEXT k

Notice how the cursor stays at the corner except when darting out to do another column.

Therefore, in this Loop, you issue the cursor ADD command BEFORE you draw the BLOCK. Since you want to start with a Block/column, the first ADD command must be equal to zero – which you get by multiplying bays*(k-1). You DEL 1 within the loop, which means your cursor jumps back to the origin for every column. This is far tidier, and there are no DELs to do after the loop is finished.

Nested For.. Next Loops You will want to repeat that set of columns throughout the floor. Having already done the front row, you can repeat the loop for the middle row and end row. Instead of repeating the loop, you could put another loop around the loop! It is called ‘nesting’. If you do this, be sure to use a different counter name – in this case, I have used ‘n’ and ‘k’. I have used the ‘tidy’ method of drawing the loop. And you can now see why the tidy method is better. If you use the other method, you risk getting confused as to the best place and number to DEL. This now represents a complete ‘Storey’ module – which could be looped vertically too – No reason why you cannot have three nested loops!

!Do one floor BLOCK width,depth,clsz !Do all the columns FOR n=1 TO bdep+1 ADDy bays*(n-1) !Do 1 row of columns FOR k=1 TO bwid+1 ADDx bays*(k-1) BLOCK clsz,clsz,ftfh

!Do one floor BLOCK width,depth,clsz !Do all the columns FOR n=1 TO bdep+1 ADDy bays*(n-1)


!Domino House demo !For... Next Loops !3D Script

!Do all the floors FOR m=1 TO snum ADDz ftfh*(m-1)

PEN 1: MATERIAL matl depth=bdep*bays+clsz width=bwid*bays+clsz

!Do one row of columns FOR k=1 TO bwid+1 ADDx bays*(k-1) !One Column BLOCK clsz,clsz,ftfh DEL 1 NEXT k

Modify the script you have been working on so that it looks like this – the result should look like a whole floor of the building, with columns. Add in Titles at the start of the script. When you make the final modifications in the next stage, you will have the whole building.

PEN 1: MATERIAL matl depth=bdep*bays+clsz width=bwid*bays+clsz

!Domino House demo !For... Next Loops !3D Script

2D script: As this is a simple rectangle, with columns, use PROJECT2 3,270,1 which will show a wireline view of the house, revealing the columns.

DEL 1 NEXT k DEL 1 NEXT n DEL 1 NEXT m !Do the Roof ADDz ftfh*snum BLOCK width,depth,clsz DEL 1

Now Loop the Floors...

!Glass MATERIAL “Glass” ADD clsz/2,clsz/2,0 BLOCK width-clsz, depth-clsz,ftfh*snum DEL 1

You can now add in another loop around the first two, using the counter ‘m’ which will repeat the floors for as many floors as you have in the building. Finally, you could add a Glass sheath.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

More 3D Commands – Prisms


OONER or later, you have to produce shapes which cannot be done with Blocks and Cylinders. Prism can form complex outlines in 3D. PRISM (and its variants) is the most common 3D statement in creative GDL. I use PRISM in preference to using BLOCK, even for rectangular objects. Because you enter the XY locations of the points, you can stay at the origin and the PRISMs can happen according to their XY locations. It is always best to draw the Prism out on paper before you enter the XY coordinates, numbering all the points.

PRISM is for a polygonal shaped object which has the same colour all over, no hollow faces or curved surfaces, and no holes. The local origin can be anywhere, but the prism is always built up the Z-axis, off the X-Y Plane. You should declare the MATERIAL property before hand. PRISMs can have *negative* thickness values and grow *down* instead of *up* the Z-axis.

PRISM_ (prism underscore) gives you the power to control the faces and to include curves and holes by using masking values. For now, just put 15 after every XY location; later in the Cookbook, the role of *masks* is explained in more detail. You can finish off the final coordinate with a 15, or if you plan to add holes, you can put a negative number (–1 will do) which tells GDL that you have finished drawing the outline. With curved edges (Polylines), you can use PRISM to produce Cylinders and ovals.

cPRISM_ (coloured PRISM underscore) is identical to PRISM_ with the addition of a line to describe the materials of the top surface, bottom surface and side surface. It also uses masking codes for the edges, and supports polylines (curves) and holes. When you make a library object by the conventional method from the floorslab tool, ArchiCAD always does floor slabs as cPRISM_s in the 3D script.

!PRISM Demonstration !Syntax:- PRISM number,height, ! x1,y1, x2,y2,...etc MATERIAL "Sandstone" PRISM 9, 0.2, 0.00,0.00, -0.10,0.30, 0.10,0.30, 0.10,0.40, 0.20,0.40, 0.20,0.10, 0.15,0.10, 0.15,0.00, PRISM (and its variations) is 0.00,0.00 perhaps the most commonly used

3D command in GDL

!PRISM_ Demonstration !Syntax:- PRISM_ number,height, ! x1,y1,15, ! x2,y2,15,...etc MATERIAL "Sandstone" PRISM_ 9,0.2, 0.00,0.00,15, -0.10,0.30,15, 0.10,0.30,15, 0.10,0.40,15, 0.20,0.40,15, 0.20,0.10,1000+15, 0.15,0.10,15, 0.15,0.00,15, 0.00,0.00,-1

Note, that by adding 1000 to the 15, you can create inter esting tangential curves. This is your first view of the power of Polylines

!cPRISM_ Demonstration !Syntax:! cPRISM_ topmat,botmat,sidmat, ! number,height, ! x1,y1,15, ! x2,y2,15,...etc cPRISM_ "Sandstone","Pine","Zinc", 9,0.1, 0.00,0.00,15, -0.10,0.30,15, 0.10,0.30,15, 0.10,0.40,15, 0.20,0.40,15-2, 0.20,0.10,1015-2, Note that by changing 15 to 13 (or write 0.15,0.10,15, it as 15-2), you can effect subtle 0.15,0.00,15, changes in the appearance of the 0.00,0.00,-1

curved surface. The vertical lines in the curve can be hidden This is explained in the section on Masking.


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Car Park Barrier This useful exercise illustrates: • Using a PRISM to keep a rectangular object axial with a cylinder • Having articulated elements in the model • Using the FOR... NEXT Loop to repeat objects • Using IF... THEN... ELSE... ENDIF • Using Subroutines to ensure modularity • Using PEN command to set colour of object This library object could be used in designing a campus or car park. In a flythrough, the bar could lift as the camera passes.

3D Script The first part of the script (until the END command) could be called the ‘executive script’. Always title your scripts. Use RESOL to set a limit to the curvature of the bar. Because this model has moving elements, set out from the beginning to use subroutines. Remember to write the END statement before you write the subroutines. 100: First the Post is built. You should start by specifying Material and Pen. For this post, we make use of the PRISM – far more useful than BLOCK, although more difficult to write, at first. PRISM allows you to locate points anywhere on the X-Y plane, whereas BLOCK always ties you to the local origin. The hinge is a cylinder. 200: The object which includes the bar is a Cylinder first, and then a colour circle is placed at the halfway point on the bar, and finally, the script includes a counterweight, using a Prism command. Ensure that the right number of DELs is used within the subroutine. This is an object oriented approach. The arm is wholly contained in a subroutine so that it behaves like an object. Returning to the main script, you just have to raise the cursor to the height of the hinge, issue a rotation command, and then call the subroutine with a GOSUB command. Hey Presto! it appears in the right place.

Parameters As the barrier changes its plan shape, you cannot use A and B. Fill in the remainder of the parameters. To avoid excessive complexity, I have not made everything parametric, only the things that matter in this exercise. !Barrier w lifting bar !3D Script RESOL 12 GOSUB 100


ADD 0,-0.3,0.9 ROTy rotarm GOSUB 200 !Arm itself DEL 2 END !----------------100:!Main Post object MATERIAL bmatl: PEN 1 PRISM 4,1.0, 0.15, 0.15, -0.15, 0.15, -0.15,-0.15, 0.15,-0.15 ADDz 0.9 ROTx 90 CYLIND 0.4,0.05 DEL 2 RETURN

Tips and Tricks – Typographical format for all PRISMs • Indent the XY numbers – it is much easier to read and repair. • Write the word PRISM in upper case. Only use an underscore form of prism if you need to make use of masking, curves or holes. • Tabulate the numbers using the commas to line up the list of numbers. Express numbers in the 0.00 format, so that all the commas line up. Even if

they do not line up, force the commas to line up, using your spacebar. • When you have a problem with Prism, it is often because you have made an error with the commas. That is where you should first look for errors. • Prisms close themselves. The Prism in the examples has 8 sides and 8 points, but I advise you to get into the habit of joining the first point to the

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

last, making 9 point XY coordinates in all. This is because when you insert holes or openings, or write out XY lists for other forms such as extrude, you need to close all prisms and other 3D forms by return to the starting point.


The GDL Cookbook 3 – Discovery

Material and Pens To make an item a bright colour, set Material to ZERO and the object’s colour will then follow the PEN colour. This is easier than having to create many materials of different colours. For this reason, it’s a good idea not to tinker about with the colour palette, at least not the top line of the palette – if you are likely to be using Pen colours to set object colours.

Stripy Arm – using the FOR... NEXT loop

200: !Swinging Arm MATERIAL bmatl: PEN 1 CYLIND blen,0.03 !Arm ADDz blen/2 ROTx 90 MATERIAL 0: PEN ccol CYLIND 0.01,0.2 !Disk DEL 2 ROTy 180 MATERIAL bmatl: PEN 1 PRISM 4,0.5, !Weight 0.1, 0.1, -0.1, 0.1, -0.1,-0.1, 0.1,-0.1 DEL 1 RETURN

Right: This is what it should look like.

THIS is a good example of the need for a repeating loop – for example where we need alternating colour stripes on the bar. It is also an example of the IF... THEN... ELSE... ENDIF in action. First of all, add a Boolean choice to the parameter box offering the user a plain or stripy arm. 200: Next, take the CYLINDER command out of subroutine 200: and replace it with a GOSUB 250. The GOSUB becomes as much of an object as the CYLIND command was before – another example of the object oriented approach, 250: Assuming that the ideal stripe length is approx 0.3 metres, the script calculates how many stripes could be in the bar length. It rounds that down to an integer number, and works backward from that number to calculate what the exact stripe length should be. Now run a FOR...NEXT loop to draw the stripes. A little ‘flag’ called stcol keeps track of which colour stripe we are drawing. As it draws each stripe, it multiplies stcol by (-1), which changes its value from -1 to +1. When stcol is negative, the stripe is white, and when positive, it is red. By using the counter ‘k’ in the FOR NEXT loop as part of the calculation, it is possible to DEL after drawing each coloured cylinder, before hitting the NEXT k command. In these cases, you usually multiply the distance to be travelled by (k-1), one less than the counter.

2D Script As the model articulates, you cannot use a standard symbol, you need to write a 2D script. Issue the PROJECT2 command as in the previous examples.

What makes autoscripted objects •Stretchy•?


ACH new object is allocated a value for A, B and zzyzx depending on its size when first made. The first three active lines of an autoscript are MUL commands: so that if a user stretches it to make a different value of A, B or zzyzx, the object will be stretched in that dimension. The Bounding Box hotspots always fit A and B, thus making them control stretchiness. 1.34

200: !Swinging Arm MATERIAL bmatl: PEN 1 GOSUB 250:!StripyArm ADDz blen/2 ROTx 90 MATERIAL 0: PEN ccol CYLIND 0.01,0.2 !Disk DEL 2 ROTy 180 MATERIAL bmatl: PEN 1 PRISM 4,0.5, !Weight 0.1, 0.1, -0.1, 0.1, -0.1,-0.1, 0.1,-0.1 DEL 1 RETURN 250:!Stripy Arm IF stripy=0 THEN MATERIAL bmatl: PEN 1 CYLIND blen,0.03 ELSE MATERIAL 0 stnum=blen/0.3 !num of stripes strsp=blen/INT(stnum) !length stcol=1 !Set a ‘flag’ FOR k=1 TO stnum stcol=stcol*(-1) !Toggle flag IF stcol>0 THEN PEN 91 ELSE PEN ccol ADDz strsp*(k-1) CYLIND strsp,0.03 DEL 1 NEXT k ENDIF RETURN ! Name : temp ! Date : Wednesday,May 5,1999 ! Version : 6.00 If new object is stretched ! Written by ArchiCAD to 10 metres wide, its ! width is multiplied by 10/ MULX A/ 8.599127 8.599127 thus making it MULY B/ 5.354173 fit the new size MULZ ZZYZX/ 0.2 ADD 0.012093,5.922268,0.2 RESOL 36 GLOB_SCRIPT_TYPE = 3

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Modify Library object


HIS exercise is a demonstration of how to modify a library object autoscripted by ArchiCAD. First, using slab tool, you knock out a shape, like this. My first recommendation is to build it as CLOSE TO, or ON to the origin of the main model as you can. Better still, use ‘snapto-grid’. That means that one of the points in the slab script will be 0,0.

Procedure for ArchiCAD 5.x and which can also be used for 6.x Position the camera using 3D Projection Settings so that it views it orthographically in plan with the camera at 270 degrees. Note that many models, like slab built windows or trussed rafters require you to position the camera as if looking from north of the object, in elevation. You should get a view like the one below, either in Hidden Line mode or in Shaded mode. While viewing the 3D image, use the File Menu to do a Save As... and save it as a Library Object (.GSM object). You will see a box asking if it is an Object, a Window or a Door. Why they don’t ask you if it is a Lamp, I don’t know – if you want to make Lamps, you have another stage to go through to convert it. Tick the ‘remove redundant lines’ box. If you hide redundant lines, only the visible top lines will be saved. You are asked if you want to save as Editable or as Non-editable Binary data. Never save as Binary if you want to edit the object. The File will take far more space on disk, and loses all parametric qualities except for size. A Binary file has all been compressed into one lump of data. This can be advantageous for complex objects as they will render more reliably and carry all macros with them. But that isn’t the case here. So I hope you will save this in EDITABLE form.

Whichever method you have used, Save it, and then drop the object into the Project floor plan – then Open Library part.

Procedure for ArchiCAD 6.x: If the object is built flat on its side on the ground, like a window or trussed rafter, use the procedure for AC5. If the object is the right way up, then select the group of elements, then from the File Menu, Save Special... as an ‘ArchiCAD object’. You save it to your library, and you can then open it from the File menu and modify it, perhaps convert it to a window or a lamp, or just tweak it.

I recommend that you always use the AC6 procedure if the object is seen in plan. It is quicker and easier, and guarantees that the object will be an Editable Object. Even better, the object is fully 2D scripted with POLY2 and HOTSPOTs, whereas the other method draws a 2D Symbol instead. If the object is going to be on its side, then you can still use the AC5 3D-based method.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery ! Name : tempbin - BINARY OBJECT ! Date : Wednesday, May 5, 1999 ! Version : 6.00 ! Written by ArchiCAD ! This is what you get if you MULX A/ 8.599127 save as Binary. You can do MULY B/ 5.354173 nothing with it, except to MULZ ZZYZX/ 0.2 insert a ROT or MUL. It has ADDX 0.012093 ADDY 5.922268 no parameters apart from A, B and zzyzx (height) BINARY 1,1 ! Name : temp ! Date : Wednesday,May 5,1999 ! Version : 6.00 ! Written by ArchiCAD ! MULX A/ 8.599127 MULY B/ 5.354173 MULZ ZZYZX/ 0.2 ADD 0.012093,5.922268,0.2 RESOL 36 This is what GLOB_SCRIPT_TYPE = 3 GLOB_CONTEXT = 3 your GLOB_SCALE = 100 Autoscripted GLOB_NORTH_DIR = 90.0 3D Script GLOB_FRAME_NR = -1 GLOB_EYEPOS_X = 299.259 looks like GLOB_EYEPOS_Y = 165.035 GLOB_EYEPOS_Z = 1.7 GLOB_TARGPOS_X = 289.381 GLOB_TARGPOS_Y = 184.934 GLOB_TARGPOS_Z = 1.7 GLOB_HSTORY_HEIGHT = 2.9 !!Slab-001 PEN 1 Because the ADDZ -0.2 locations are GLOB_LAYER = "Floors" stored in GLOB_ID = "Slab-001" millionths of a GLOB_INTID = 3 metre BODY -1 accuracy, you cPRISM_ "Pine","Pine","Pine", are causing the 7, 0.2, ArchiCAD -0.012093, -0.568094, 15, -0.012093, -5.922268, 15, parser must 5.991071, -5.922268, 15, spend longer 5.991071, -3.618351, 15, reading 8.587034, -3.618351, 15, through all 8.587034, -3.196507, 15, that data and -0.012093, -0.568094, -1 building the BODY -1 object. DEL 1

Tips and Tricks: Instant GDL!


VERY element in ArchiCAD can be expressed in GDL, which is the underlying language of ArchiCAD. If you want to see what •anything• looks like in GDL, try this and be amazed. Arrange your project window so it occupies half the screen. Open a New Library object file and arrange the empty floating 3D script window so it occupies the other half (click the white script button to make it float). Now select any part of the Project, grip the part(s) by an edge and Drag’n’Drop into the 3D script. Instant GDL!! You can do the same with any group of 2D elements, Drag’n’Drop into the 2D script window. It’s brilliant! Most complex 3D items such as EXTRUDE, REVOLVE and the profiles for TUBE and SWEEP use the same syntax as a POLY2. So you can copy the XY data from a POLY2 command and paste it into the 3D script for a complex 3D command. This technique only works satisfactorily if some part of the objects to be dragged are on the main origin. 1.36

! Name :temp - Editable Object ! May 1999

This is what

it can look ADD 0.012093,5.922268,-zzyzx PEN 1 like after MATERIAL “Pine” some PRISM 7, zzyzx, pruning -0.012, -0.568, -0.012, -5.922, Change height of 0.2 to zzyzx 5.991, -5.922, 5.991, -3.618, If you are a fanatical pruner, 8.587, -3.618, you can even truncate the XY 8.587, -3.197, coordinates to 3 decimal places -0.012, -0.568 – this speeds up 3D drawing. DEL TOP Make sure the start and end points are the same.

3D Script These MUL commands allow the object to be stretchy. If your object is fixed in size and not stretchy, delete all the MULs and delete zzyzx from the parameter box. Leave the ADD commands in place, unless you build your object over the Project Origin. • These long lists of Global Variables are simply a housekeeping record of the conditions prevailing at the time the object was made – current drawing scale, eye position etc. These can all go. • As the first object is based on a floorslab, there is additional housekeeping in the form of the GVs for the slab – current layers etc. These can all go. BODY commands can go. • Finally, you should replace the DEL 1 command at the end of the script with a DEL TOP. If not, leave each DEL 1 or DEL 2 in place until you get more used to tinkering with object scripts. • Finally, if you really want to cut deep with the pruning knife, you can change the CPRISM_ to a PRISM_, thus enabling you to remove the references to materials. You need to place a MATERIAL command before the prism. • You can cut even deeper by removing all the masking values, and the underscore, to make it a bare PRISM. Do not do this if you want to add holes or polylines, or to retain different coloured surfaces on the prism.

2D Script Amazingly, this is even more verbose with Global Variables than the 3D script. These can all be cleared out. You are left with a matching ADD command, a POLY2 to outline the PRISM shape, and a nice bunch of Hotspots for each point in the slab.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery !Name

: temp

ADD20.012093, 5.922268 PEN 1 POLY2_B 7,1,0,0, -0.012093, -0.568094,1, -0.012093, -5.922268,1, 5.991071, -5.922268,1, 5.991071, -3.618351,1, 8.587034, -3.618351,1, 8.587034, -3.196507,1, -0.012093, -0.568094, -1 HOTSPOT2 -0.012093, -0.568094 HOTSPOT2 -0.012093, -5.922268 HOTSPOT2 5.991071, -5.922268 HOTSPOT2 5.991071, -3.618351 HOTSPOT2 8.587034, -3.618351 HOTSPOT2 8.587034, -3.196507 HOTSPOT2 -0.012093, -0.568094

This is the tidied up 2D script. the original auto script is far to long to print here!

This powerful Fire engine model was built in a day using the technique in this section: stealing prisms from ArchiCAD. A little bit of GDL knowledge is used to organise details like the glass and the doors Here you see it sitting on its pile of constructional prisms.

Analysing and Extending the 3D Script This is very simple example – you might go a lot further, for example, make the Pen parametric, adding parametric Materials, drilling holes in the prism, or editing the dimensional data outlining the prism, or duplicating the prism into a stack of repeated prisms, in case it is part of a shelving system.

With AC5, autoscripted objects always have a vertical parameter called V_SCALE, and in AC6, this is called ‘zzyzx’. There is no reason why AC5 users cannot rename the height factor ‘zzyzx’ and thus make their objects more useful (and stretchy) when they upgrade. Leave the ADD commands in place. If you had built the slab literally ON THE ORIGIN, you could delete these too. • You could add an extra pair of lines: MATERIAL M_ PEN L_

If the script is really very long, then you can use the Find and Replace Feature quite effectively. It must speed up reading of the script if you can remove a lot of the clutter. Search and replace all instances of “GLOB_” with “!”..... and more besides. You can also insert useful comments above PRISMS to identify what they are.

to make the object conform to the pen and material selectors in the main settings box. This is making use of Global Variables. However, if your object contains several objects of different materials and pen colours, you are best to include those in the script, and to tick the box to use the ‘Object’s own Settings’.

Steal this routine.... This procedure is quite convenient even for hardened GDL users. It is good for knocking out complicated shapes, without having to work out the XY locations yourself. Put up a 2D image of the object you want to make (like the Fire engine above or a Bus), explode it, and trace over the main body panels with the slab tool. Drag each slab into the 3D script window, label each one, and then reorganise each prism with the correct thickness and material. Once you have got the hang of this technique, you can ‘steal’ the X,Y locations in Slab/Prisms to define many other things, such as the pathway of a tube, or the locations of glazing bars.

The Golden Rule: use the Origin One of the most important rules to remember is to try to build the original object ON THE MASTER ORIGIN of the Project. Moving the origin somewhere else doesn’t work. You have to do it on the original origin. To move a temporary origin back to the original, click once on the temporary origin, hit delete, and it will restore the main origin. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Bits of Syntax SHADOW


SHADOW – sometimes you must turn off shadow rendering even when the rest of the object is shadowed – for example glazing fittings – which if curvy and casting shadows could prevent ArchiCAD ever finishing a render. In a model of a car, you can speed up rendering by issuing a SHADOW OFF command before drawing hubcaps or door handles. SHADOW ON and SHADOW OFF could be used in IF statements – for example, if the object is further than 50 metres from the camera location then do not cast shadows.

MODEL – sets a viewing mode for the model, or parts


of the model. Normally, if you want the whole model to be wireline, hidden-line surface, or solid shaded surface, you can change it in the main menus of ArchiCAD. The benefit of the MODEL command is that you can single out parts of the model to draw differently from the rest. For example, in a tree model, you might want the trunk and branches to have a clearly outlined form, yet make the leaves to be drawn as shaded surfaces only, with no edge lines. Another example could be an atrium roof glazing structure, where, with a Boolean Yes/No command in the dialog box, the glazing could change from shaded to transparent wireline.


Example of modifying library objects This curved 3D truss can be made in about 60 seconds, based on an algorithm that parses the outlines of a PRISM (saved as an ArchiCAD object just by clicking out a piece of floorslab). The user just has to copy the Prism’s XY locations, and paste them into the 3D script; the remainder of the script just has to read them in. Pre arranged routines decide how to organise the tubular steel framing.

All these car body shapes (in Motorist) have been made by dragging slabs from the Floor plan into the 3D Script and then reorganising thicknesses and materials, and applying cutplanes and small details as required.

Tips and Tricks – Join a User Group – or make one!


RAPHISOFT are always willing to listen to constructive criticism or wishlists. But users’ voices are more effective if you are a member of a user group; also, you might find from the more experienced users that many of the things you want are already possible. If there isn’t a group around, then form one with friends, locally. Register the group with Graphisoft in your country. Another major group you could join would be the GDL Alliance, a truly international collection of GDL writers. You could email the GDL Cookbook author for details of the UK group, or about the GDLA.


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

More about GDL 2D Commands Advice on 2D Scripting

Modifying Objects



HENEVER you can, and if you have the skill, always try to write a 2D script with a parametric or complex object. 2D scripting is good because... (1) of the speed of drawing in the project plan. With PROJECT2 AC must do a 3D hidden line projection of the object before drawing it. (2) a Symbol, which could be the alternative, is not parametric. (3) the 2D script can itself be highly parametric, error checking, informative, and scale aware. If it is too complex to script in 2D, and too slow to generate a PROJECT2 image from the 3D script, consider using symbols called by the FRAGMENT2 command.

HOTSPOT2 x,y should be used in every 2D script:

NDER AC5, autoscripted objects used to be give a drawn symbol, and some code in the 3D script made them stretchy. In AC6+, autoscripted objects are fully scripted as a mass of LINE2s and HOTSPOT2s. This can sometimes be a pain, and I often delete the whole lot and replace them with a PROJECT2 command. This is essential if you intend to alter or rotate the object in the 3D code. If you are willing to, you are best to rescript it in a much simpler, more usable, parametric form. Another method is to place it in the Project Floor Plan window with a Project2 command active, Explode the object, then Copy the 2D symbol thus created and Paste it into the 2D symbol window of the object. Add the command FRAGMENT2 ALL,1 to the 2D script. Retain Project2 until you get the symbol and drawing aligned. Then delete Project2. You can add Hotspots manually to the 2D symbol. If the symbol is too full of lines, replace them with Fills, much tidier.

Hotspots make Stretchy Objects!

Picking Up: to enable you to pick objects up. Snapping To: they also give a point that adjoining objects can ‘snap-to’, which could be useful for objects which need precise location – like lecture theatre chairs, or gutters to walls. Making Stretchy: if you use A and B as dimensions, the Hotspots at the outer corners may enable you to stretch the object. Stretchy objects are among the most useful and user friendly objects.


0,0 A,0 A,B 0,B

Stretchy: A typical listing of HOTSPOTs when the Origin of the model is at the bottom left.

HOTSPOT2 -A/2,-B/2 HOTSPOT2 A/2,-B/2 HOTSPOT2 A/2, B/2 HOTSPOT2 -A/2, B/2

Stretchy: A typical listing of HOTSPOTs when the Origin of the model is at the centre of the model.

If the Hotspots are written as illustrated here, and if A and B are parameters of the 2D and 3D forms of the object, then the object will be STRETCHY!

You can send a Hotspot directly to a location, e.g. HOTSPOT2 1.6,0.9 or you can write it the long way as:

TEXT2 is for adding text to an object’s symbol. Apart

ADD2 1.6,0.9 HOTSPOT2 0,0 DEL 1

from being able to label the object, the object can use it to display a level of intelligence, e.g. flashing up a text warning if the object has bad parameters, or displaying the final size of a stretched object, the pitch of a stretched staircase, or the serial number of a manufacturers component. It is only worth using if you are first prepared to learn how to DEFINE STYLE; if you do not, you will have no control over the size of the text, or how it plots at different drawing scales. The text can be adaptable to different scales, including not displaying itself at all when it would be too small to read (e.g above 1/ 200) See the ‘Fire Extinguisher’ exercise for an example of DEFINE STYLE.

!The same result HOTSPOT2 1.6,0.9

Are your HotSpots Stretchy & Squeezy? IF you want objects to be Squeezy as well as Stretchy, you need to utter your HOTSPOT2 commands <BEFORE> the commands which actually draw the 2D objects. Otherwise, objects may stretch, but not reduce in size correctly. You must also provide some hotspots that are not on the stretchy corners or you will have trouble picking up your object – it may stretch every time you try to drag it! If you do a good set of hotspots, remove the bounding box hotspots. In AC6.x, hit the ‘Details’ button in the object building window and cancel the checkbox.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

CIRCLE2 Draws a circle which you can control by location and radius. !Syntax: CIRCLE2 x,y,radius CIRCLE2 0,0,0.5

ARC2 draws a circular line, which you can control by location, radius and angles (in degrees). Angles start from the Horizontal and move in an anticlockwise direction.

!Syntax: ARC2 x,y,radius,startangle,endangle ARC2 0,0,0.5,90,180

Cursor control in 2D scripting ADD2, ROT2 and MUL2 are the Cursor movement commands in 2D scripting. ADD2 and MUL2 always have to be specified with X and Y in the same command. e.g. ADD2 1.50,0 will do the equivalent of an ADDx in 3D.

POLY2 POLY2 simply draws a polygon – a sequence of lines – a lot more economically than a series of LINE2 commands. It can be filled or empty.

POLY2_ POLY2_ (underscore) is an en-

Unfortunately, you do not see a visible cursor. One trick is to use the CIRCLE2 0,0,0.01 command as a substitute cursor and keep pushing it along just in front of the cursor movement command. e.g. ADD2 1.50,0 CIRCLE2 0,0,0.01

!Syntax POLY2 n, framefill, !x1,y1, ..... xn,yn PEN 1 SET FILL 'Earth' POLY2 9,3, 0.00,0.00, -0.10,0.30, 0.10,0.30, 0.10,0.40, 0.20,0.40, 0.20,0.10, 0.15,0.10, 0.15,0.00, 0.00,0.00

What is Framefill? 0 means draw nothing, 1 draws the line, 2 draws the fill pattern but no line, 4 means close the Polygon (if not already closed). Any additive combination of these can be used – e.g. 3 is the sum of 1 and 2 so you get the lines and the fill pattern, 6 [2+4] results in a closed filled polygon with no line!, 7 [1+2+4] gives you everything.

hancement of POLY2 – you can control the line drawing of each part of the polygon; you can use ‘polylines’ (curved elements) and drill holes. POLY2 and POLY2_ can be filled with a fill pattern. The figure must be closed for this to work. For any poly to be filled, you must specify one more than Framefill attribute is normally left as ‘1’ for unfilled Polygon drawing. the number of points – the first point However, you can vary this with 7 permutations. If you wish to control is repeated as the last point. The Pen Colours of the Fill, then you must use POLY_2A and POLY2_B.

More 3D Drilling Holes in Prisms


RISMs may not be able to have holes through them, but the addition of an Underscore makes PRISM_ which can have holes and curved lines. With PRISM_, you end each XY location with a 15. The trick with holes is that you must end the description of the outline by repeating the first point as the last point with a -1, then begin a new set of XY points, also with 15, and then use a -1 to end that hole. You can have as many holes as you like as long as you follow that sequence. The end point of each group of points must be the same as the start point.


!PRISM_ Demonstration ! including Hole !Syntax:- PRISM_ number,height, ! x1,y1,15, ! x2,y2,15,...etc MATERIAL "Sandstone" PRISM_ 9+7,0.2, 0.00,0.00, 15, -0.10,0.30, 15, 0.10,0.30, 15, 0.10,0.40, 15, 0.20,0.40, 15, 0.20,0.10, 15, 0.15,0.10, 15, 0.15,0.00, 15, 0.00,0.00, -1, 0.00,0.05, -0.07,0.25, 0.15,0.25, 0.15,0.15, 0.10,0.15, 0.10,0.05, 0.00,0.05, RETURN

15, 15, 15, 15, 15, 15, -1

My tip for hole making is to express the number of points as I have done here, e.g. 9+7, not as 16. This way, you can remind yourself how many points make the outlines, and how many are in the hole – and how many holes you have. Put a linefeed between the list for the outline, and the one for the hole.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

More GDL Syntax Introducing Global Variables


LOBAL Variables are current conditions and settings of your project. They are known by ArchiCAD. GDL objects can, at any time, interrogate them and make use of the information.Under ArchiCAD 6.0 and 6.5, you have many more Globals available than with AC5, although many of the new ones are not usable for 2D and 3D model building (they are for listing). Meanwhile the following are the GV’s you could usefully use. For the rest, check the GDL manual.

GLOB_SCALE Drawing Scale, (formerly known as (f.k.a.) A_) Use this to determine how complex a 2D scripted symbol will be. For example, at scales up to 1/20, you show rebates in door jambs, at 1/50 you can show them as rectangles, and beyond that, they are rendered as simple door swings. this can reduce the time of screen redraw and plotting times. The Filestamp/Desktop clock in the Voyager cookbook demonstrates how A_ can be used.

GLOB_HSTORY_ELEV (f.k.a. B_) tells the elevation of the storey (the ‘home’ storey) that the object is currently placed on. This is important if you have a staircase, and want it to show on the home storey as the start of a flight, and on the next as the end of the same flight.

GLOB_FRAME_NR (f.k.a. N_) current frame number in animation or flythrough, GLOB_FIRST_FRAME (f.k.a.O_) first frame index in flythrough, and GLOB_ LAST_FRAME (f.k.a.P_) last frame index in flythrough are useful for making objects change during an animation. (see the ‘Growing Building’ in Voyager). S_ to Z_ could be freely used as variables, and were needed in all versions of ArchiCAD before 5.0, because it was easy to run out of simple alphabetic letters for variables. But now, you must NEVER use these. Although GV names are now in a long format, the OLD ones are still valid, and old Global Variable names are still recognised. Many new ones have been created and these may come back into use.

C_, D_, E_ F_, G_, H_, I_,K_, L_, M_, R_ are all vital for windows and doors. They will not fit correctly into walls unless you use these.

SYMB_VIEW_PEN (f.k.a. L_) is the default pen of

WALL_THICKNESS (f.k.a. C_) is the most vital GV

library part.

in window making! WALL_MAT_A (f.k.a. G_) is the wall material on the side opposite to the opening side. This can vary from opening to opening placed in the same wall. I standardise this to be the internal wall surface (opposite the ‘hotline’ of the wall). WALL_MAT_B (f.k.a. H_) material of the wall on the opening (or Hotline) side. WALL_MAT_EDGE (f.k.a. I_) material of the wall reveals. By lucky coincidence, if you use a cPRISM_ to build a window surround, you can start with CPRISM_ G_,H_,I_,.... Isn’t that easy to remember!


imitations to Globals: Certain things cannot be found from Globals and may have to be found using the REQ and the REQUEST commands. Most globals are numbers; REQUESTs are usually used for returning Strings (of letters). An example of REQUEST is current System Time and Date. Another is the object’s own name and label.

the library part.

SYMB_MAT (f.k.a. M_) is the default material of the A script like this below will reduce the number of parameters in your dialog box by two, as the user can now click on the pop-up selectors provided by Graphisoft in the normal object settings dialog box. The object is forced to use the material and pen that are selected in the object settings box.


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

More Global Variables These two illustrations come from the Help pages on Syntax and GDL which are available in ArchiCAD 5.0. Help in ArchiCAD 6.x is provided through Web Pages and Acrobat files. These images may be old, but they present a very simple route to using Global Variables.

A~ to J~ are useful (essential!) in getting windows and doors working in 3D and drawing in 2D correctly. Windows are somewhat of a black art and are the subject of a special exercises in the Discovery and Voyager course. The following are most useful for Location Aware objects:

GLOB_EYEPOS_X, GLOB_ EYEPOS_Y, & GLOB_EYEPOS_Z (f.k.a. K~, L~ & M~) tell the object where the most recent camera is located.

GLOB_TARGPOS_X, GLOB_ TARGPOS_Y, & GLOB_ TARGPOS_Z (f.k.a. N~, O~, & P~) tell the object what the camera is looking at – the ‘target position’.

SYMB_POS_X, SYMB_POS_Y, SYMB_POS_Z (f.k.a. X~, Y~ & Z~) tell the object where the object itself is in the overall project. These are useful for getting things to face the camera, or change as the camera approaches..

SYMB_ROTANGLE (f.k.a. W~) is the rotational angle of the object. No matter how you rotate the object, it will always face the camera if you use the algorithm illustrated on this page.

GLOB_CSTORY_ELEV, GLOB_CSTORY_HEIGHT, GLOB_CH_STORY_DIST (f.k.a. Q~, R~ & S~) tell you how objects relate to the storey displayed in the Project Floor Plan window.

GLOB_SCRIPT_TYPE and GLOB_ CONTEXT (f.k.a. T~) returns information on the ArchiCAD window, or view that you are currently using. T~ used to do both. Now, you can know if your object is being executed in a particular Script or in a Window (Elev or Plan or 3D) and modify it accordingly. This is extremely useful for complex objects. If GDL is reading the 3D script and knows that the object is actually

!Location Awareness !with camera global variables dkx=K~ - X~:IF dkx=0 THEN dkx=0.001 dly=L~ - Y~ dmz=M~ - Z~ dr =SQR(dkx^2 + dly^2) !Plan distance dd =SQR(dkx^2 +dly^2 +dmz^2)!Distance azi=ATN(dly/dkx) !Azimuth IF facecam THEN ROTz 90+azi-W~

The classic Location awareness subroutine. The adjustment to dkx avoids a divide by zero error. If azimuth is critical there is more to it than this, but this routine is good enough for trees and people.

being generated in 2D at that moment (in a Project2 command) you use subroutines to draw planar 3D elements (instead of solid ones) in the script. See a later exercise on this (Lattices-1).

GLOB_NORTH_DIR (f.k.a. U~) gives the direction of Project North; you could tell where the Sun is – for solar panels or shading devices. With U~ (and finding from the user the time, date and Latitude, you can write a script to calculate the quantities of sunlight falling on Solar panels, Walls, Windows, etc, and can get sun breaking devices like louvres to change their angle during an animation. It is not yet possible to find out (by Request or Global) the Lat. and Long of a site. My ‘Stardome’ (a model of the visible Universe) finds the northpoint (U~) and rotates accordingly.

SYMB_MIRRORED (f.k.a. V~) is useful if you have a scripted 2D symbol, and want to ensure that Hotspots and text in objects still appear the right way round and in the right place, even when the symbol is mirrored. When you tick the ‘mirrored’ checkbox in the Object settings dialog, the 2D symbol and the hotspots will be mirrored for you. However, you might want the Properties script to know that the object has been mirrored – for example in specifying right or left handed desking units in interior layouts.

Long or Short Global names?


THE AC6.0 and 6.5 manuals explain GVs a lot better than their predecessors. However, I preferred it when Globals were based on short names. When you use them with long names, you always have to check the manual that you have spelt them correctly!

After you have been through these pages, you may find the manual easier to read! However, it is more likely that after you have tried a few exercises, you will also find these pages easier to read. Do everything one step at a time!


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Globals in Action As an example of using Globals, here is a tiny 2D Script


HIS little object is a stretchy pointer/labeller, whereby no matter how much you rotate the entire object, the round box with the line in it remains upright. If the object is ‘mirrored’ then V~ is 1, else V~ is zero. W~ is the angle of rotation of the object. Two simple IF statements enable you to decide which way to rotate the circle. If you want tighter code then you can reduce the number of lines (see below). It is not essential to use ‘tight code’ because the GDL parser is quite happy to read two lines instead of one. It’s a matter of professional satisfaction – as you get better at GDL you aim to tighten up your code.

!2D Script !Demonstrates !control of rotation !Stretchy HOTSPOT2 HOTSPOT2 HOTSPOT2 HOTSPOT2

Hotspots 0,0 A,0 0, B/2 0,-B/2

!This one-line routine !keeps the circle level IF V~=0 THEN ROT2 -W~ IF V~=1 THEN ROT2 W~

!Circle CIRCLE2 0,0,B/2 LINE2 -B/2,0,B/2,0 DEL 1

Here is another way of doing it – shorter – by using an ELSE in the IF statement:

!Pointer Line psiz=B/10 HOTSPOT2 B/2,0 LINE2 B/2,0,A,0 !Arrow POLY2 3,1, A-psiz*2,psiz, A,0, A-psiz*2,-psiz

Here is the shortest way of doing it – by using the Global as a flag (whose value is either 0 or 1); you can then apply a trick which changes 1 and 0 to 1 and -1 (see TIPS:Maths Tricks of the Trade.)



See the Value List example in the Fire Extinguisher!

Value Lists


WROTE in earlier versions of the GDL Cookbook how much I wished that ArchiCAD could support Popdown menus in GDL – Lo and Behold, in AC 6.0 onwards we did have popdown menus! – but the method for making these lie in an unexplained part of the manual – called VALUES. Value Lists are now one of the most desirable features of GDL. You can make objects even smarter by offering the user a list of options in words or numbers, in the same way that you are offered materials and pen colours. This makes the user’s decision more informed, and makes it less possible for them to make an error. If your popdown menu offers three distinct choices for the shape of an object, the user cannot mistakenly enter a fourth and wrong choice. There are many examples throughout the Cookbook of value lists at work. Value lists are written in the Parameter script or Master script (in 6.0, they can be written in their own script window). You then need some IF statements in the Master script to decide what to do with the user’s choice. Words or Numbers work well in value lists, but I find that wordy value lists are more helpful to the user in describing the purpose of their choice – from which numbers may be the consequence.


For example, for a smart car model, you can script a pop-up menu saying ‘Saloon’, ‘Coupe’, ‘Estate’, ‘Convertible’ and your script can interpret that and use an IF statement to set a flag of values 1, 2, 3 and 4. These numbers can be used in subroutines to produce the correct shape of car. An even better innovation in 6.5 is the availability of Pictorial Value Lists which can work in a custom designed dialog box (the ‘user interface’) – you can offer the user a scrolling set of picture tiles of the sort that you may have seen if you have used the recent Door and Window libraries from Graphisoft. GDL objects can now be much friendlier to the user, and for the developer, there is less need to write error catching routines. VALUES 'fxtype' 'Water','Halon', 'Powder','Foam','CO2'

A typical script for a Value List, and the result

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Attribute Definitions

See the Attribute Definition example in the Fire Extinguisher! See Voyager for Define Texture and Line type



NLY a Masochist could possibly enjoy DEFINE FILL and DEFINE LINE_TYPE; but DEFINE STYLE and MATERIAL are essential parts of your vocabulary. Once defined, you can command GDL to use a Style, Material etc, by the command SET. In fact, you do not need SET; just saying MATERIAL followed by the name will be sufficient.

DEFINE STYLE is essential if any TEXT2 is to be included in a 2D sym- IF shodata THEN DEFINE STYLE ‘display’ ‘arial’, bol – followed by the SET STYLE (or fhigt,1,0 just ‘STYLE’) command for short). SET STYLE ‘display’ TEXT2 0,w2,’span’ It is even more important if you TEXT2 0,0, tmod*(tnum-1) have more than one line of text, and ENDIF if you intend to print or plot the plans, RETURN because you can control the position of the text, and the font plotting and printing height. Once you have a correct working statement like this one, you can copy it and paste it to your next 2D Script. In fact, keep it in your Scrapbook or The ‘touchtone’ keypad symbolises the way that TEXT is located vertically Notepad for frequent use. and justified horizontally.

Size Most dimensions in GDL are always assumed to be in Metres, but this is one odd case where font height produced by the plotter has to be defined in millimetres (even in the USA) For this reason, when you state the font size in the parameter box, you must use use ‘real number’, or ‘integer’, and not use the ‘length’ , because ‘length’ could be changed by the dimension settings of the project. If font size is not stated, the TEXT will not appear. Anchor defines the position where the text starts writing. If you use ‘1’, it will be left justified, and above the point of text entry. If you use 2, it will be centred, and if you use 3 it will be right justified. Larger numbers change the vertical position of the text. It’s like the keypad of a touchtone phone. FaceCode is simply whether the text is plain, italic, bold etc. Codes are: 0=Normal, 1=Bold, 2=Italic, 4=Underline, 8=Outline Outline, 16=Shadow. Shadow You can combine the numbers.

DEFINE FILL is a nightmare as you have to define Fill patterns in binary, valuing each dot. The same command also includes routines to define the fill by vectors. But then if you don’t have a fill, all your objects could have transparent 2D symbols and look wrong. For the moment, here is a very useful routine for making a pure white fill. In other cases you can have a user parameter, asking the user to specify the fill for the 2D symbol. For this definition, the number of zeroes is very important. DEFINE FILL 'nofill' 0,0,0,0,0,0,0,0, 0,0,0


!count the 11 zeroes!

DEFINE MATERIAL is very important if you want to carry materials with your GDL object so that, when dropped into someone else’s model, will still have the correct colour and appearance. People often tweak their materials and material index numbers change. ‘Whitewash’ and ‘Stainless Steel’ may have disappeared... Mercy! In my smart car object, it is vital that red tail lamps and indicators look right, and that the white bodywork of the police car does not look as grey as ‘whitewash’. The taillamps change from reflective red in daylight, to brightly emitting red when the lights are turned on. DEFINE MATERIAL "Bright_Metal" 0, 0.84, 0.83, 0.85, !Surface RGB 0.95, 0.10, !ambient, diffuse 0.95, 0.0,!specular,transparent 57, !shining 4, !transparency attenuation 1,1,1,!Specular RGB 0.0, 0.0, 0.0, !Emission RGB 0.0 !Emission attenuation shmat=IND(MATERIAL,"Bright_Metal")

This is definitely Voyager stuff so the example is for reference. To make your life easier, GDL has predefined surface qualities, like ‘metallic’(3) so try this simpler definition: DEFINE MATERIAL "Metalpaint" 3, 0.84, 0.83, 0.85 !Surface RGB

This is better than MATERIAL 0: PEN ccol

2: Matte: non reflective 3: Metal: shiny but non reflective 4: Plastic: not shiny, but reflective 5: Glass: transparent (with colour) 6: Glowing: with colour 7: Constant: horrid! no shading

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Status and Masking values S

Masking Values on Prisms

Masking Values on everything else



Status Values apply to things which are 2Dimensional in nature (even if they are 3D objects). All they can do is to say if a Line is to be drawn or missed out. POLY_ and POLY2_ are the prime examples of 2D elements that uses Status Values. 3D Scripts which define a 2D outline for 3D form-making also use Status values – for example, defining a profile in TUBE, SWEEP and REVOLVE.

ASKING values are used to define how a surface is to be drawn on a 3D Prism. The Top surface is always drawn. But the definition of the side surface needs to describe the actual face and all the lines surrounding the surface. On Prisms, there are only 0-15 permutations of lines and surface to each facet of the prism. When you are not sure, just write 15 – that draws everything. If you put an 8 in, it draws the surfaces without the lines. If you want to make one side draw differently from another, experiment with the script to make sure that you attach the different value to the correct line.

TATUS & Masking values – are one of the reasons why new purchasers of ArchiCAD snap the GDL manual shut again, assuming that they will never cope with GDL. But when they are explained, the GDL user rapidly recognises the values of masking, and learns how to apply it.

Masking Values apply mostly to 3D objects – elaborating the details of how to object is to appear in 3D – lines and surfaces.

ITH more complex ob jects, you declare an overall masking value for the whole thing, which is written on the first line. For safety, just start by writing 63 for most objects until you need to change it. Certain objects also have special considerations:- for example, with REVOLVE, you can have a starting angle surface and an ending surface. The masking values for this will behave differently from a SWEEP. Therefore for Masking values, you need to have handy access to a manual. The Cookbook gives a summary of the object masking for each complex 3D command. Adding 64 to the masking (e.g. 63+64) will reveal all the lines which make it. For example in a COONs, you will see all the triangulation See the Masking example in the lines. Bocaccio Chair 10 pages ahead

Let’s explain Prism masking better... For Planar elements the choice of drawing line edges is either Yes or No

For Prisms, there are 0-15 permutations for the status of edges. This is an example of 13: no vertical lines visible on the curved surface.

Masking values are the numbers that come after each XY location in the listing of a PRISM_ (underscore) and other similar 3D objects. In Autoscripted objects, these are either 15 or 79, or -1. 1 draws the bottom edge line. 2 draws the vertical side line. 4 draws the top edge line. 8 draws the side surface as solid. 64 smooths the edge You can add these yourself in any combination. The examples adjacent illustrate this point.

15 means draw everything, 13 means draw everything except vertical lines (left). 8 draws the Prism with surface only, but no lines. 0 makes that portion of the Prism look vacant. 79 means that 64 is added to 15, telling GDL that the point is part of a curve and that the smoothing should occur in photorendering. –1 means that the object outline is finished. This is the binary system in action.

Fill Patterns

2D Crosshairs

Quick fill patterns for bitmaps are as follows: DEFINE FILL ‘blak’ 255, 255, 255, 255, 255, 255, 255, 255, 1,0,0 ! totally filled fill DEFINE FILL ‘grey50’ 85, 170, 85, 170, 85, 170, 85, 170, 1,0,0 ! 50% filled fill DEFINE FILL ‘grey25’ 85, 0, 170, 0, 85, 0, 170, 0, 1,0,0 ! 25% filled fill DEFINE FILL ‘tiled’ 64, 192, 192, 192, 192, 192, 255, 255, 1,0,0 ! 3D tiled effect

IF stretchiness is a big feature of your object, the A.B points may not actually be within the object boundary. To make them visible to the user, plant a 2D crosshair at the A,B points. e.g. for point A,0, write in the 2D script: LINE2 A-0.02,0, A+0.02,0 : LINE2 0,A-0.02, 0,A+0.02 Don’t forget that it is better to declare all your stretchy Hotspots before you issue the Project2 or the rest of the 2D script.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery See the Polylines example in the Fire Extinguisher!


Special mask/status values: Curvy edge lines


T IS DIFFICULT to say which part of the GDL Manual is the most alarming to the GDL newcomer The section on ••Polylines•• would be firmly linked with the other leading contenders like the PIPG, VERT, BODY sections, the Properties scripting; CWALL and CROOF; OUTPUT & INPUT; PUT & GET; XFORM. Polylines are in fact easier than all of those. GDL Voyagers need Polylines: For Discoverers, let’s make a start. Polylines are best learnt a bit at a time. The exercises in the Voyager and a few in the Discovery make use of Polylines and explain them as you go along.

PolyLines – why use them?


OLYLINES enable you to make interesting shapes with PRISMs and other functions that you could not achieve with XY coordinates. You can use Polylines with POLY_, PRISM_, CPRISM_, BPRISM_, CROOF, EXTRUDE, PYRAMID, REVOLVE, SWEEP, TUBE, POLY2_, CUTPOLYA, WALLHOLE and more. Polylines are also more economical – if you look at a curve that has been autoscripted as a cPRISM_, it turns a circle into 36 polygonal X-Y coordinates, each with 6 figures of decimals, and followed by a 79. Make a slab with a circular hole into a simple Library part and examine the script for yourself. All these 79’s can be replaced by just two lines, or sometimes just a tweak of an existing line. Polylines are also controllable by RESOL, RADIUS and TOLER commands. Some Polylines have to work together – e.g. if you want to issue a command that involves Radius of rotation, it will return an error unless you have first defined a Centre of rotation.

What is



Zzyzx is a ‘dynamic parameter’ denoting HEIGHT. We are already used to the idea that A and B are parameters for width and length – ArchiCAD recognises them as special ‘magic’ parameters that can make objects stretchy. They are given special prominence in the Settings dialog box. The vertical parameter ‘zzyzx’ is named after a small town in the Mojave desert in Nevada; the Heathrow to LAX jumbojets pass right over it. Zzyzx is the magic parameter used for height,

PolyLines that are immediately USEFUL and USABLE: 900, 1000, 4000. Some of these have already been illustrated in earlier pages of the Cookbook. Polylines are fully covered in the Voyager section of the GDL Cookbook. Usually, prisms etc. are defined by absolute XY values. The lower numbered polylines (100, 200, 300 etc) are very useful for ‘relative’ locations, i.e. ‘turtling’ from point to point.

and if you use it, the height will be displayed in the Info Box Palette. Objects with zzyzx can be stretchy in the 3D view – a 3D hotspot set will appear at the height specified by zzyzx and if you grab the spots, the ‘pet palette’ displays a ‘stretch vertically’ option. See Tips and Tricks in the Voyager course for more about zzyzx.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Try Polylines yourself!


HIS SHAPE on the right is an ordinary PRISM_ with all points defined as XY locations, and 15 used as the mask (15 means draw all lines and surfaces on the edge). Now try converting it to make use of Polylines. 1000 is the easiest PolyLine to use – starting from one point, it branches off in a graceful round curve and lands on the next point – the one that has the 1000 command written into it. It’s a tangential curve, because the existing straight start and straight ending lines define the way that the curve leaves and arrives. You can write 1015 or you can write it as 1000+15 – the longer way of writing it helps you pick it out visually from a long block of script, and displays how the 1015 was derived.

!PolyLine 1000 Demo PRISM_ 9,0.2, 0.00,0.00,15, -0.10,0.30,15, 0.10,0.30,15, 0.10,0.40,15, 0.20,0.40,15, 0.20,0.10,15, 0.15,0.10,15, 0.15,0.00,15, 0.00,0.00,-1

!PolyLine 1000 Demo PRISM_ 9,0.2, 0.00,0.00,15, -0.10,0.30,15, 0.10,0.30,15, 0.10,0.40,15, 0.20,0.40,15, 0.20,0.10,1000+15, !<add 0.15,0.10,15, 0.15,0.00,15, 0.00,0.00,-1

Ordinary Prism

Prism enhanced by Polylines

Using PRISM and Polylines to make a Hollow Cylinder Polyline 900 and 4000 are good companions for making circles. 0,0,900 means that the centre of the Cylinder or circle is at the point of the origin, 0,0. 0.1,360,4000 means draw a circle of Radius 0.1, through a full circle of 360 degrees. This gets you a solid Cylinder. Using the same Circle Centre, you can issue the 4000 command again, with a smaller radius, and you will get a hollow tube. Using 13 instead of 15, you could reduce the number of lines to be drawn on the side surfaces.

!PolyLine 900,4000 Demo PRISM_ 2,0.2, 0,0,900+15, 0.10,360,4000+15

!PolyLine 900,4000 Demo PRISM_ 3,0.2, 0,0,900+15, 0.10,360,4000+15, 0.08,360,4000+15


Object Naming ArchiCAD 6.5 requires that all Library Objects end in the suffix .GSM (even on the Mac), and a similar limit applies to Doors and Windows (.WIN and .DOR). There are more special suffices for Zone stamps, Lamps and Labels. This makes them more portable. Beware if you convert a complex 6.0 project to 6.5. Archive that old library before throwing it away. You might wish you had kept it! Folders in a Library should reflect the logic of their contents. ‘Doors’, ‘Windows’, ‘Labels’, and so on.


Object names should include the ArchiCAD version number (50, 60,65,70) and should be distinguishable from other objects in a loaded library: to avoid ‘missing or duplicated objects’ messages. For example ‘door.DOR’ is bad, but ‘door_glazed_ntc65.DOR’ is unlikely to clash with anything else. Avoid names longer than 27 characters+3, and avoid using spaces in object names. Although supported by Mac and windows, there are problems with building the index at the time that libraries are loaded, and with calling macro objects. Underscores should always be used instead of spaces.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Curvy 3D commands bPRISM_ bPRISM_ (bent PRISM underscore) is similar to cPRISM, with the added ability to curve it – by adding in a value for a radius. It always curves in a downward direction, along the X-axis. If you want to curve •upwards•, you can issue a MULz -1 (multiply all Z values by -1) command first. You can also enter a negative value for the depth of the prism, and bring it below the origin (and thus make a tighter curve). When you do a cursor movement or change, it’s wise to DEL as soon as it is possible afterwards.

360:!bPRISM_ Demonstration !Syntax:! bPRISM_ topmat,botmat,sidmat, ! number,height,radius, ! x1,y1,15, ! x2,y2,15,...etc bPRISM_ "Sandstone","Pine","Zinc", 9,0.05,0.4, 0.00,0.00,15, bPRISM requires -0.10,0.30,15, every point to have 0.10,0.30,15, a masking value. 0.10,0.40,15, Start by giving it 0.20,0.40,15-2, 15, then change 0.20,0.10,1013, some to 13 [15-2] to 0.15,0.10,15, remove vertical 0.15,0.00,15, lines. 0.00,0.00,-1

With bPRISM, you can make long helices, and perforated tubular structures. It also reverses the materials of Top and Bottom.

MULZ -1 GOSUB 360:!bPRISM Demo DEL 1

Most 3D commands require you to enter the ‘number’ of X-Y coordinates in the object. For example PRISM 4,0.2 means that there are 4 points on the prism, with a height of 0.2. Similar rules apply to REVOLVE, SWEEP and almost all complex 3D forms. Masking Values: The next command, REVOLVE is the first to use a Masking value for the whole object – usually 63. Each command has a different way of using these. Each complex command in the GDL Cookbook is accompanied by a small explanation of the object masking codes.

See the REVOLVE example in the Fire Extinguisher!



EVOLVE takes the outline (that can be ‘drawn’ in the same way as in POLY_, PYRAMID or EXTRUDE – onto the X-Y plane) and Revolves it around the X axis. It doesn’t allow you to describe any points with a Y value that is zero or negative. i.e. All points must be higher than the X-axis – one millimetre will suffice. You cannot drill a hole in the cross section. The last number on the first line is the MASK. To get the REVOLVE drawn as totally solid, 63 is the ideal mask. If the object is solid and lathed, then 63 will do. However, a revolving object that is free of the centre (like a torus / doughnut) must have a masking value of 0 to start off with. REVOLVE can give you an object standing upright if you first apply ROTy –90 first. A Vase, Baluster, Classical column – in fact most REVOLVEs are preceded by a ROTy -90. RESOL is a big issue with REVOLVE. One single revolve can result in hundreds of polygons, especially as the drawn out line can have include curved polylines. 1.48

FPRISM_ and SPRISM_ are covered in the Voyager Course

!REVOLVE Demonstration !Syntax:- REVOLVE n,alpha,mask, ! x1,y1,s1,....xn,yn,sn REVOLVE 9,90,63, 0.00,0.01,0, -0.10,0.30,0, Remember, the ‘n’ 0.10,0.30,0, after commands 0.10,0.40,0, like REVOLVE 0.20,0.40,0, 0.20,0.10,1000, and SWEEP is the 0.15,0.10,0, number of XY 0.15,0.01,0, points defining 0.00,0.01,-1 the outline. !REVOLVE Demonstration !Syntax:- REVOLVE n,alpha,mask, ! x1,y1,s1,....xn,yn,sn ROTy -90 REVOLVE 9,90,63+64, Changing these last 0.00,0.01,0, values from 0 to 1 -0.10,0.30,0, will remove the line 0.10,0.30,0, 0.10,0.40,0, that follow the 0.20,0.40,0, sur face of the 0.20,0.10,1000, revolve. 2 produces 0.15,0.10,0, a hard edge that 0.15,0.01,0, overcomes the 0.00,0.01,-1 smoothing in a DEL 1 rendering.

Revolve is one of the must useful commands in GDL – but draw the X-Y outline on paper first to think it out

Revolve is always built around the X axis. So if you want it to stand upright, issue a ROTy -90 command before the Revolve command.

Masking: 1=Base surface, 2=Top surface, 4=Side surface Start, 8=Side surface End, 16=Side edges Start, 32=Side edges End, 64=Cross section edges. With a mask of 127 (or 63+64) you get all the lines drawn, but do you want all these? – your choice! Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Fire Extinguisher


HIS LITTLE SCRIPT produces a useful ob ject; it also introduces more techniques in 1 page than any other exercise in the Cookbook! It covers: REVOLVE; PolyLines; zzyzx, Value Lists, Defining Material, 2D text.

Parameters The colour and type of the extinguisher is determined by the Value List – which also generates a Defined Material and a Text annotation. The height of the barrel is called ‘zzyzx’ – enabling it to be stretched. You could also have a value list for Litres/Gallons and let the value list work out the best diameter and size from a known range of sizes (you could then delete ‘d’ and ‘zzyzx’).

VALUES 'fxtype' 'Water','Halon', 'Powder','Foam','CO2'

If you want the user to have a pop-up menu of options, put this script into the Values List/Parameter Script. The Master Script parses the result.

3D Script Declare Material & Pen. Reduced resolution of curvature will speed up rendering, TOLER does the best job. • REVOLVE is done along the X-Axis, so you have to ROTy -90 for the object to stand upright. Remember to DEL 1 afterwards. Setting out the X-Y locations for REVOLVE is like laying out a set of points on the X,Y plane – just as you might do for a POLY. • You need a sleeve at the top of the bottle, & a squirting spout – done with CYLIND. • Finally, you build a PRISMatic handle on top. This requires you to position the X-Y plane sideways, so more cursor commands are required to get the cylindrical top and handle into place. DEL 4 to finish – always return the cursor to the origin. Polylines: In the REVOLVE and PRISM commands, the use of a 1000 poly line command (added to 15 in the PRISM) is required to get a tangential curve between the two points mentioned. Type in the same commands without the 1000; use a 0 or a 15 instead, and then put the 1000 back in – see what happens. This is a good exercise to experiment with Polylines. The last status codes for the Revolve, 1, remove visible lines on the bottle. Try them with 0 instead. You can also remove surplus lines from the handle with a -2 on each of the 15s.

Master Script This works out suitable values for the Red, Green and Blue components of the colour of the bottle and handles and defines a new Material based on these colours – using a plastic surface quality. Revisit the Fire Extinguisher in the Voyager course

!Fire Extinguisher !Discovery and Voyager !Bottle Body MATERIAL 'fxmat' PEN pcol TOLER 0.002 !Curvature ROTy -90 REVOLVE 4,360,63, 0 ,dm/2,1, zzyzx-0.06,dm/2,1, zzyzx ,dm/6,1001, zzyzx ,0.00,1 DEL 1 !Handle MATERIAL 'hanmat' ADDz zzyzx CYLIND 0.03,0.03 ADD -0.03,0,0.06 ROTy -110 !Master Script MATERIAL 'nozmat' IF fxtype="Water" THEN CYLIND 0.05,0.01 pred=0.6:pgrn=0.0:pblu=0.0 ENDIF DEL 2 IF fxtype="Halon" THEN ADDz 0.03 pred=0.0:pgrn=0.6:pblu=0.0 ROTx 90 ENDIF ADDz -0.02 IF fxtype="Powder" THEN pred=0.0:pgrn=0.0:pblu=0.6 MATERIAL 'hanmat' ENDIF PRISM_ 9,0.04, IF fxtype="Foam" THEN -0.03,0,15, pred=1.0:pgrn=1.0:pblu=1.0 -0.04,0.05,15, ENDIF 0.11,0.10,15-2, IF fxtype="CO2" THEN 0.12,0.09,1015, pred=0.0:pgrn=0.0:pblu=0.0 0.03,0.05,15, ENDIF 0.12,0.01,15, DEFINE MATERIAL 'fxmat' 4, 0.12,0.00,15, pred,pgrn,pblu 0.03,0.03,15, DEFINE MATERIAL 'nozmat' 4, 0.03,0.00,15 0.8,0.8,0.8 DEFINE MATERIAL 'hanmat' 4, DEL 4 0.01,0.01,0.01 !Fire Extinguisher

!2D Script PEN pcol HOTSPOT2 0,0 ARC2 0,0,d/2,15,345 CIRCLE2 0,0,0.03 RECT2 -0.04,0.02, 0.12,-0.02 IF fsize>0 THEN DEFINE STYLE "ftext" Arial, fsize,2,0 SET STYLE "ftext"

TEXT2 0,0,fxtype ENDIF

2D Script Instead of using PROJECT2 (just too easy), try writing a simple 2D script, which looks just as good, and will guarantee faster drawing in your plan view. Use the ARC2 command to get a hidden line effect. If the user enters a valid Font size, the script can label the Extinguisher. The TEXT2 routine can indicate whether it is Water, CO2, Foam, or Powder. You could also write a short properties script that will send this information to a Components Listing. Question: If you use A_ (drawing scale) can you autosize the text so it is always the same relative to the object?

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Simple Sash Window


HIS EXERCISE explains the basics of how to make a simple window, using drilled prisms.

For serious architectural work, authentic looking windows and doors are essential. If you do not find a suitable one in the existing library, you have to make one. It is not well explained in any of the official literature, and too much trust is placed in building windows with the slab tool, and relying on a 3D view saved as a Library object to make the window. These may look OK, but will not be parametric. The window explained here is so simple that you could easily make it with slabs, but then it wouldnt be parametric. This exercise shows how a window COULD be made with scripting. With the knowledge gained from doing this exercise, you will better understand how ArchiCAD uses windows, and can then attempt windows of a more complex nature that go well beyond what can be done with the slab tool. Windows that use soldier courses and sills, or chamfered reveals require a knowledge of Global Variables. These tell the GDL object the current thickness and materials of the walls. Windows always cut rectangular holes in the wall based on the dimensions A and B. If the window is not rectangular, you have to build chunks of wall around it (to finish as a rectangular shape) or use the new AC6 command, WALLHOLE. Let’s stick with a rectangular hole for now.

Golden Rules ...for making Windows (and Doors) • Build the window with the outside face facing downwards, level with project zero. (Even though you may want to recess the frame into the opening, you should build the GDL model as stated). • Position the origin on the centre line of the lowest sill of the window. • PRISM_ makes better frames than BLOCK – but TUBE makes better frames than PRISM_, including rebates and chamfers, and more complex curves. • Use POLY instead of PRISM for Glass unless you want it to look thick. • Repeated items like sashes should be self contained subroutines. • Create the 2D view by using the PROJECT2 4,90,1 command, with a ROT2 180 command to ‘turn the camera upside down’. You could then attempt some 2D scripting, using Project2 as a guide. • The A dimension is the width of the window, and B is the height. (Autoscripted windows do this too, but go very wrong when you add jamb, sill and head brickwork.) If you use B for height, you will be able to stretch the windows in Section / Elevation. • When you get more confident, experiment a bit at a time with opening sashes, multiple glazing bars, jamb, head and sill details, reveals, architraves and ironmongery. 1.50

Exterior (left) and Interior (right) views

Finished 3D window should look like this in the 3D window – lying face down, bottom face flat on the X-Y Plane.

Parameters If you open the new Library object as a Window, you get a parameter box like this. Much of the middle section is not required until you start using jambs and head details. It is possible to start a window as an ‘object’, and convert it to a window later. It cannot cut holes in walls until it is officially defined as a ‘window’ in ArchiCAD.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery !Truly simple window !GDL Cookbook !3D Script p=0.04 !Min. frame dimens’n PEN 1 !Offset to lower left corner ADDx -A/2 !Main Frame MATERIAL fmat PRISM_ 5+5,p*2, 0,0,15, A,0,15, With PRISM_ A,B,15, you have to add 0,B,15, a ‘status value’ 0,0,-1, of 15 to the end p, p,15, A-p,p,15, A-p,B-p,15, p, B-p,15, p, p,-1 !Both ADD GOSUB DEL

of each coordinate, and -1 to tell it to change from the outer to the inner outlines of the frame.

sashes p,p,p 100 !Lower Sash 1

ADD p,B/2-p/2,0 GOSUB 100 !Upper Sash DEL 1 !Sill ROTy 90 MATERIAL fmat PRISM 5,A, 0,0, p*2,0, p*2,p/2, 0,p, 0,0 DEL 1 DEL 1 !Undo offset END:!------------------------

3D Script • Use a simple variable to represent the smallest ‘pixel’ size of your object. Here, ‘p’ (representing frame thickness) is much easier to use in the prism commands than real dimensions. It means you can change the frame thickness by changing the value of the one single variable. • Because you must Centre the origin on the axis of the window, but because it is also easier to build anything from the bottom left corner, apply an ADDx -A/2 offset. You will see how it works when you try it. • Material command is essential because sash windows could be wood, PVC, aluminium, or a variety of colours. • PRISM_ command defines the main frame of the window. By using the main variables of A and B, and a frame thickness of ‘p’, it is easily defined. Use 15 for all the points, and -1 to denote the end of one surface and the start of another. • The sashes occur twice, and you need to have the sash frame and the glass act together as a single object, so you should make the sashes as a subroutine. • The Sill is a simple prism, rotated so as to lie flat in the correct location, facing downwards. • Make sure you put comments in for each small routine. • Finally, you DEL the -A/2 offset. • The routine must finish with an ‘END’ command so that you can write your subroutines below.

END:!--------------100:!Sash Subroutine sh=(B-p*2)/2+p/2 !Sash Ht sw=A-p*2 !Sash Width MATERIAL fmat PRISM_ 5+5,p, 0, 0,15, sw,0,15, sw,sh,15, 0, sh,15, 0, 0,-1, p, p,15, sw-p,p,15, sw-p,sh-p,15, p, sh-p,15, p, p,-1 ADDz p/2 MATERIAL gmat PRISM_ 5,p/4, p, p,15, sw-p,p,15, sw-p,sh-p,15, p, sh-p,15, p, p,-1 DEL 1 RETURN

• The sash is created with a subroutine. To keep it simple, work out the height and width of the sash first, and then use the simple variables ‘sh’ and sw’ in the PRISM command. Note that the Glass is exactly the same prism profile as the hole in the sash frame prism – so you can copy and paste the coordinates. • It is a good idea to enable the user to define the material for Glass in case the user wants to use Ice (for translucency) or Mirror.

Complex window shapes Windows and Doors are made, by default, with Rectangular openings. More complex window shapes can now be made with the WALLHOLE command. See the Curvy Window in the Voyager course, and a simpler curvy window in the Discovery course.

2D Script

!Window - 2D Script ROT2 180 PROJECT2 4,90,1 DEL 1

Finally, the 2D window script looks like this. I use a Project2 command, but unlike the 3 you have used for other objects, you use 4. The ROTy 180 turns the camera upside down (so that the image is corrected). If you want superfast 2D redrawing in a large building, this 2D image should be scripted using the Project2 as a guide – and when the scripted one looks correct, you delete the Project2 command.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Simple Curvy Window


HIS EXERCISE exploits the wonderful new command in ArchiCAD 6+ called WALLHOLE. It also demonstrates the effectiveness of easy-to-use Polyline statements. It quite liberates the GDL user from the complex procedures for making windows that are not rectangular. If you can define the outline of the window shape with the similar set of commands that you would use to draw a POLY, EXTRUDE or PRISM , then you can make a window..... with the limitation that a single WALLHOLE command must be convex in shape. To make concave window shapes (such as an L-Shape), you can make two or more Wallholes together. This window is a simple arched window, with fixed glazing and a simple outlined frame, but it is ideal for illustrating the principle. A more complex use of Wallhole is illustrated in the Build it on the X-Y floorplane as usual, with the Voyager course. outside frame face on level zero, and the origin on the centre axis. !Very Simple round window !3D Script RESOL 36 WALLHOLE 4,2, -A/2, 0,7, -A/2,B-A/2,5, A/2,B-A/2,1007, A/2, 0,7 ADDz fdep/2 MATERIAL gmat POLY_ 4, -A/2, 0,7, -A/2,B-A/2,5, A/2,B-A/2,1007, A/2, 0,7 DEL 1

3D Script MATERIAL fmat PRISM_ 5+5,fdep, -A/2, 0,15, -A/2,B-A/2,13, A/2,B-A/2,1015, A/2, 0,15, -A/2, 0,-1,

Parameters: A and B define width and height

-A/2+fwid, fwid,15, -A/2+fwid,B-A/2,13, A/2-fwid,B-A/2,1015, A/2-fwid, fwid,15, -A/2+fwid, fwid,-1

The list of X-Y locations can be copied and pasted from the WALLHOLE outline straight into the POLY definition, without change. Although POLY requires only 1 or 0 for the Status setting, any odd number is the same as 1, and even number is equivalent to 0. The Wallhole outline has been modified with a 5 instead of the usual 7, to remove the lines around the arch. The same has been done for the Prism, using 13 instead of 15. The window is beautifully stretchy when viewed in section. I love WALLHOLE. It’s so effective and compact and precise. I use it even for rectangular windows.

2D Script Note that for the script in 2D, you follow the trick shown here, to do a Project2 having first done a 180degree rotation. For a window that is to be used many many times, you could script the window using the RECT2 command. 1.52

The 2D symbol in plan !Simple round window !2D Script ROT2 180 PROJECT2 4,270,1 DEL 1

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Maths Operators ABS(number) returns the positive value of a number, regardless of whether it is negative or positive. You can prevent the user entering negative parameters into the dialog box with a simple statement like: item=ABS(item). SGN(number) returns a 1 if the number is positive, or a -1 if the number is negative. Small token numbers like this which signify the status of a number are called ‘flags’, in programming jargon. RND(number) returns a random number value between 0.0 and 1.0 and is multiplied by the number in the bracket, e.g. RND(50) is numbers from 0 to 50, RND(0.1) is from 0.0 to 0.1. RND numbers are Real Numbers, so can only be used to generate Dimensions if you are using Metres. Unfortunately, GDL’s random number generator is weak, and generates the same sequence each time from a fixed list, with a preponderance of low numbers. The only way to get a more nearly random number is to get the list to start from anywhere but the start. You could do FOR k=0 TO SYMB_POS_X: x=RDN(1): NEXT k (the list is started from the number equal to the object’s horizontal distance from the plan origin – different in most cases). In animations, you could use the Frame number as a randomisation seed. INT(number) returns the integer of the number – an integer is a round number (without decimals). The INT command ALWAYS rounds downwards, so you can do x=INT(number + 0.5) to get it to round up OR downward correctly. Example: INT(8.56) = 8 (rounds down) INT(8.56+0.5)=9

(rounds up)

CEIL (number) is similar to INT, collects the nearest integer number larger than the number. SQR(number) returns the square root of the number. This is useful in matters like the use of Pythagoras Theorem in Triangles, and Circle geometry. If you need Cube and Quad roots, try using the Power symbol – e.g. length**(1/3), width**(1/4) FRA (number) is the other side of INT(). It returns the fraction remaining when you remove the integers. Unfortunately it behaves always in one direction, so FRA(6.3) returns 0.3, but FRA(-6.3) returns 0.7. PI is useful in circle geometry – it is exact, and therefore better than trying to put in your own number, such as 3.1416, and incurring errors in a calculation. MIN( ) and MAX( ) are useful – they simply tell you the highest or lowest of a series of numbers or variables that you print in the brackets. For example: ADDz MAX(leftht,rightht)

to raise the cursor to the height of one of the ridge of a monopitch gable wall. NOT( ) is useful in IF statements. You could write IF

thing=0 THEN GOSUB 100, but it is more like english to write IF NOT(thing) THEN GOSUB 100. Also because NOT() either returns a value of 1 or zero, you could use it as a flag, as in: LET rotation_angle= 30*NOT(thing). When ‘thing’ is valid, the angle would be zero and if ‘thing’ is zero, then the angle will be at 30degrees. AND and OR and EXOR are used as arguments in IF statements. For example, you could say: IF item>4 AND item<6 THEN GOSUB 500. This would certainly identify a floating point number in the region of five. IF item<4 OR item>64 THEN GOSUB 500 would activate with all numbers except those between 4.0001 and 63.999. Usually, if you say it to yourself slowly in English, and digest the natural logic of the AND and the OR argument, you will get it right. I have never needed to use EXOR, but it is exclusive whereas OR is inclusive. EXP, LGT, LOG are ‘transcendental’ functions, to do with ‘e’ and logarithms. These would be useful if using curves, but I have not needed them yet. MOD is a way of finding the remainder after a division. For example 8 MOD 2 equals 0 because 2 divides perfectly into 8. 8 MOD 3 equals 2 because if you divide 8 by 3 it goes twice and leaves a remainder of 2.

Trigonometrical functions SIN( ), COS( ) and TAN( ) – Trigonometry functions are explained in the diagram below. ATN(), ASN(), ACS() mean respectively ArcTan, ArcSin and ArcCos. This means that if you know the sides of a right angle triangle, you can easily work out the angles. ArcTan(0.231) will return you the Angle which, if you calculated TAN(angle) would give you a TAN of 0.231. This is essential if you are building lattice trusses.

Common maths symbols <> Not Equal to (you can also use #) > Greater than, < Smaller than >= Great than or Equal to <= Smaller than or Equal to ^ To the power of... (you can also use **) All numbers in GDL are ‘Floating Point’, you cannot force a variable to be an integer. Declaring variables : number or string You can force a variable to be a string – this contains text. Once a variable is a string, do not change it back to a number. The script below is likely to produce a syntax error that will baffle you – but the error has been caused by a previous use of ‘n’.

LET n=”washbasin” FOR n=1 TO 5 GOSUB 100 NEXT n Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

Here, n wants to be a number again, but cannot be – it will report an error


The GDL Cookbook 3 – Discovery


You need a basic knowledge of the right angle triangle – all you need to know is:

• Pythagoras – the Square of the Hypotenuse is the Sum of the Squares of the other two sides. • SOH CAH TOA – You need to remember this motto so that you can always calculate the characteristics of a triangle from minimal information. If you don’t know this one already, say it to yourself as a mantra whilst being kept on hold on the phone, or standing under the shower. • Irregular triangles can be analysed by breaking into small right angled ones and using SOH CAH TOA. • The angles of any triangle add up to 180o. • Many Circle geometry problems (e.g. converting a known Angle and Radius into X and Y coordinates) are easily solved with SOH CAH TOA.

Remember: SOH CAH TOA SIN(angl)=Opposite/Hypoteneuse COS(angl)=Adjacent/Hypoteneuse TAN(angl)=Opposite/Adjacent



n ote


e The Right Angle


(The side) Adjacent (to the angle)

(The side) Opposite (to the angle)

Maths Operators: continued

See more about Circle Geometry and Trig in the Maths Primer in the Voyager Section.

Properties – keep it simple! P

ROPERTIES and Listing have been extensively re built by Graphisoft for AC_6.X. These provide greater opportunities for printing out schedules, but also have greater complexity. AC 6.5 carries a new manual on the subject. The main difficulties are for ArchiCAD users to set up their listings formats etc.

DESCRIPTOR There is a simple solution for GDL writers – whatever the ArchiCAD user wants to do, DESCRIPTOR can ensure that your object appears in listings with a correct description. It is no good relying on the filename of the object. If your object is smart, then the filename doesn’t really describe it very accurately. The simplest method is to use the DESCRIPTOR command. In your Properties script for the swivel chair, simply write: DESCRIPTOR "Swivel Office chair"

It becomes interesting though when you add specific manufacturer’s information. DESCRIPTOR "Herman Miller chair HM-SX0723"

This is where the growth area of GDL is going to be in the next 5 years. For the first 15 years of ArchiCAD, furniture and component library objects have been generic and stretchy. If GDL is to become (to manufacturers) as widespread as DXF has been for the last decade, then they have to see that it encourages specifiers to use their products. Its not enough just to have a self labelling 2D symbol, although this is also very valuable. A simple DESCRIPTOR command will ensure that if you put THEIR office furniture into the plan, then the correct item will be purchased. It gets even more interesting if you have a smart object which could have different descriptions depending on the user’s choice. Take the Fire Extinguisher. This simple (if verbose) property script will send a correct description to the Listing. 1.54

!Properties Script IF fxtype="Water" THEN objname="Extinguisher: ENDIF IF fxtype="Halon" THEN objname="Extinguisher: ENDIF IF fxtype="Powder" THEN objname="Extinguisher: ENDIF IF fxtype="Foam" THEN objname="Extinguisher: ENDIF IF fxtype="CO2" THEN objname="Extinguisher: ENDIF DESCRIPTOR objname






COMPONENT You can also use the COMPONENTS command if you wish to include quantitative information. For example, the Fire Extinguisher description does not include the litres of water or foam. You could calculate the capacity from the height and diameter: capac=1000*(zzyzx-d/2)*(PI*d^2)/4 !capacity calc COMPONENT "Capacity", capac ,"litres"

GDL works in metres, so you need the 1000 to convert cubic metres into litres. In the case of a real fire extinguisher, it is likely that there is a limited range of fixed sizes, so this is solely for illustrative purposes. In reality, the parameters for height and diameter might be replaced by a VALUE LIST that would allow the user to select one from a variety of given sizes, so that only the correct sizes would be passed to the Listing. Select the object, go to Calculate Menu/Components/ Basic, and you will see a small list created, showing your object.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Bocaccio Chair – Prism masking T

HIS chair is a simplified edition of the Bocaccio chair, to show how prism masking works in practical use. It also includes a material definition. The chair is simply constructed. If this object was for commercial use, one would build into it softer edges and corners. We want a cube that has a cubic chunk carved out of it. There is no 3D Boolean subtraction in GDL so we build it up from a seat prism and a prism for the arms. The left hand chair shows the chair with all masking values set to 15. Although the seat element is a square, it is a good idea to include two points that coincide with the inside line of the arm. This gives you the chance to remove the top line under the arm, but show it across the seat cushion.

3D Script Look at the masking on the Prisms for the upholstery elements. 15 means ‘show all’, so if you write ‘15-4’ that means ‘show all except the top line’.

2D Script For a commercial object one writes a proper script. It’s easy to copy the outline for the arms Prism, convert them to a Poly2 and you are almost done. The chair object on the CD is fully 2D scripted. !Bocaccio Chair !Demonstrates Prism Masking PEN pcol IF upthik>B/6 THEN upthik=B/6 !Seating These numbers could be MATERIAL setmat written as 11. If you write ADDz sethit-upthik it analytically as in this PRISM_ 7,upthik, !Seat example, you can easily -A/2, -B/2, 15-4, run your eye down the list -A/2+upthik,-B/2, 15-2, and notice errors. A/2-upthik,-B/2, 15-4-2, It’s a good idea to tabulate A/2, -B/2, 15-4, the values neatly in A/2, B/2, 15-4, vertical line -A/2, B/2, 15-4, -A/2, -B/2, -1 ADDz upthik This point PRISM_ 9,armhit, !Arms closes the -A/2, -B/2, 15-1, -A/2+upthik,-B/2, 15, prism -A/2+upthik, B/2-upthik,15, A/2-upthik, B/2-upthik,15, A/2-upthik,-B/2, 15-1, A/2, -B/2, 15-1, A/2, B/2, 15-1, -A/2, B/2, 15-1, -A/2, -B/2, -1 ROTy -90 ADDz -(A-upthik*2)/2 PRISM_ 5,A-upthik*2, !Cushion armhit+upthik,B/2-upthik, 15, The cushion is armhit+upthik,B/2-upthik*1.5,15, built on its 0,B/2-upthik*2, 15, side then 0,B/2-upthik, 15, rotated into armhit+upthik,B/2-upthik, -1 position DEL 4

!Bocaccio Chair 2D HOTSPOT2 0, 0 HOTSPOT2 A/2, B/2 HOTSPOT2 -A/2, B/2 HOTSPOT2 -A/2,-B/2 HOTSPOT2 A/2,-B/2 PROJECT2 3,270,2

!Leg MATERIAL legmat RESOL 8 ADDz 0.04 CYLIND sethit-upthik-0.04,0.025 !Cruciform Foot The object will adapt if ROTz 45 the user stretches it dm=MAX(A,B)*1.2 mischievously p=0.01 !one 3d pixel PRISM_ 13,0.04, -dm/2,-p, 15, -p, -p, 15, This Prism forms the -p,-dm/2, 15, cruciform leg in one piece. p,-dm/2, 15, By setting up values for the p, -p, 15, governing large and small dm/2,-p, 15, dimensions, you can save dm/2, p, 15, yourself a lot of typing p, p, 15, p, dm/2, 15, -p, dm/2, 15, -p, p, 15, -dm/2, p, 15, -dm/2,-p, -1 DEL 2 !Black feet DEFINE MATERIAL 'blakfoot' 4, 0,0,0 !R,G,B MATERIAL 'blakfoot' FOR k=1 TO 4 The user is free to set a ROTz 45+k*90 new material for the PRISM_ 5,0.04, main leg – it can be dm/2, -p, 15, stainless steel or painted. dm/2-p*4,-p, 15, But the feet are black. To dm/2-p*4, p, 15, make sure that they are dm/2, p, 15, always black, define your dm/2, -p, -1 own material, set it and DEL 1 use it. NEXT k

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Lattice Truss This model is a useful exercise in: • Using Trigonometry to determine lengths and angles • FOR... NEXT loops • 2D script writing • Using 2D image to display information • Defining text styles


HIS is kind of structure could be made by placing, arranging and grouping the cylinders from the ArchiCAD Library, but it would not be parametric or smart. We need GDL for a beam that is adaptable to different spans and depths.

Parameters The model is not stretchy, as the lattice is built from manufacturer’s standard sized modules. • The Truss is to be done here using only CYLIND to form the tubes. • The user is offered a choice of width, height and any number of modules, and tubing diameter. This example does not worry about joints, but it would be easy to add balls or cones, which could be a user option. • The user can ask the truss to ‘Show Data’ – this could be a print out of its span or weight. • As the truss could in fact be a vertical structure (column) or could be leaning (over an atrium) the lean angle option is offered.

3D Script Even for a small object, a strictly structured approach is adopted from the start. Resolve the model into a series of subroutines, one to draw every element of the model. The executive script is short in the extreme, just calling subroutines. The technique is to make all the upper elements, in a FOR...NEXT loop, then the bottom tube, and finally, the diagonal tubes. Some trigonometry is required to work out the angles of the diagonal tubes. As this is an important part of the script, a special subroutine 100: is proposed for working out the trigonometry and setting up other parameters.

!LATTICE TRUSS !3D Script !---- THE PROGRAM --------GOSUB 100 !check parameters ROTy -Leanang GOSUB 200 !Upper elements GOSUB 300 !Bottom tube GOSUB 400 !Diagonal tubes DEL 1 !undo Lean angle END !-------------------

100: !parameter set up !or put into Master Script RESOL 8 MATERIAL tmatl PEN tpen trad =tdiam/2 !tube radius dtang =ATN((tmod*sqr(2)/2)/tdep) dtlen =tdep/cos(dtang) RETURN

100: First set up the usual things like RESOL, Material and Pen. Then convert diameter to radius. Now work out the angle of the diagonal tubes. As the truss module as seen in plan is a perfect square, the diagonal across the square is the ‘truss module times √2’; the angle of lean of the cylinder will be the ArcTan of half that diagonal and the truss depth. Finally, the Length of the diagonal tube can be found as the hypoteneuse of the right angle triangle formed by the tube – the depth divided by the COS of the angle. Alternatively, you could work out the tube length by Pythagoras. In later exercises (winged truss) you will see that it is possible almost to dispense with trigonometry and use the TUBE command to go from XYZ point to XYZ point.


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

200: The Upper longitudinal tubes are easy enough : a matter of getting to the right position, and pumping out a CYLIND. However, note that one steps backwards by one tube radius, and makes the tube a tiny bit longer to give the impression of a butt end to the tube. The same is done for the bottom member. The FOR...NEXT Loop is needed to generate the lateral tubes. By using a loop, you can use the number of modules as a counter to decide how many to draw. Notice in this example, that we use K as a counter in the loop and also as a way of calculating how far the cursor travels before generating the cylinder. For the first tube, it moves ‘tmod*(k-1)’ which is, effectively, zero. When it gets to the 4th tube, it is moving ‘tmod*(4-1)’ which gets it to the right place. Using this method, you can do the DEL command INSIDE the FOR... NEXT loop, which is much tidier. 300: Bottom member of the truss is very easy. One long Cylinder, slightly elongated to improve the junction detail. 400: The Diagonals – well, the routine to draw the 4 diagonal tubes is a bit complicated, so it uses subroutine 450 for each truss module, so that the main FOR...NEXT loop looks tidier. 450: Rotate 45º then issue 4 leaning-over cylinders rotating 90º each time. At the end, put DEL 4+1 instead of 5. It reminds you not to forget the ROTz 45 with which you started drawing the tubes.

200: !Truss upper element !Longitudinal ADD -tmod/2-trad,-tmod/2,tdep ROTy 90 CYLIND tmod*tnum+tdiam,trad ADDy tmod CYLIND tmod*tnum+tdiam,trad DEL 3 !Truss upper tube – Lateral FOR k = 1 TO tnum+1 ADD -tmod/2,-tmod/2,tdep ROTx -90 ADDx tmod*(k-1) CYLIND tmod,trad DEL 3 NEXT k RETURN 300: !Bottom boom ROTy 90 ADDz -trad !slightly longer CYLIND tmod*(tnum-1)+tdiam,trad DEL 2 RETURN 400: !Diagonal Truss element FOR k = 1 TO tnum ADDx tmod*(k-1) GOSUB 450 DEL 1 NEXT k RETURN 450: !Diagonals ROTz 45: !first tube angle FOR n=1 to 4 ROTx dtang CYLIND dtlen,trad DEL 1 ROTz 90 NEXT n DEL 4+1 RETURN

Notice tubular ends to truss longitudinal members

2D Script It is important to have a good 2D script, as the Project2 command will take too long to display, with all those cylinders. If you wish to tilt the truss so that it’s a leanto or a Column, the 2D script would not work, so you need to use Project2. The 2D script here takes the same parameters as the 3D script, works out a few locations of the nodes, and draws quick lines and rectangles to draw the truss in plan. It also plants Hotspots in the right places. Finally, you might like to try getting the 2D symbol to give you information. In this case, the span of the truss. For this, you need to define a text style – the size of the text is parametric. This 2D display ability could be used to print out structural or weight data. It is also useful in circular objects in displaying Radius or span. The truss can also be used as a Walling element. A way to make the truss draw very quickly in the project plan is to ‘encapsulate’ your Truss: make your parametrically defined truss a library object AGAIN, so that it has a standard object symbol – providing you have no further intention of changing it. You can use this method to make an entire PORTAL.

Scripted 2D symbol if the truss is flat

Use PROJECT2 if the truss is tilted

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

!2D Script IF Leanang THEN PROJECT2 3,270,2 ELSE !if Truss is Flat LET w2 = tmod/2 !Top and bottom lengths tenx= tmod*tnum-tmod/2 benx= tmod*(tnum-1) !-------------------------RECT2 -w2,w2, tenx,-w2 FOR k=1 to tnum ADD2 tmod*(k-1),0 LINE2 -w2,-w2,w2, w2 LINE2 -w2, w2,w2,-w2 LINE2 w2, w2,w2,-w2 DEL 1 NEXT k LINE2 0,0, benx,0 !-------------------------HOTSPOT2 0,0 HOTSPOT2 benx,0 !-------------------------IF shodata THEN DEFINE STYLE "display" "geneva", fhigt,1,0 STYLE "display" TEXT2 0,w2,"span" TEXT2 0,0 ,tmod*(tnum-1) ENDIF

Truss as a wall element


The GDL Cookbook 3 – Discovery

Lattice Portal – using Lattice Truss This model is an exercise in: • Finding ways to speed up your plan drawing • Encapsulating : Making Library objects of library objects • Using the Elevation/Section window to get the model right Relax! There is no GDL coding in this exercise.


N THE Lattice Truss exercise, you had a choice of scripting the 2D as a Project2 command, or as a script. If the Truss is used as a column or a sloping beam, the Project2 command has to be used, which will take a long time to redraw. A way to make the Truss draw ex- The Plan – Using three library objects, and showing section A/1. tremely quickly in the project plan is to encapsulate your Truss: make your parametrically defined truss a library object AGAIN, so that it has a standard object symbol – providing you have no further intention of changing it. Here is the means of doing this.

Procedure Here is a single truss with 5 modules of 1.2 metres, supported by two columns of 3 modules each (3.6 metres high) Lay them in the plan, so that they relate corSection A/1 – Lift the truss into position on the columns. rectly in plan. Plant a section line just in front of the truss to give you a view of the Portal, then view the section. The columns and the beam elements start off on the floor. Use the section window to lift the beam to the correct height. Set up a 3D view, with the camera at 270º and the view set to Plan (Top View), When you have a 3D view, you can save the result as a new Library Object. Alternatively, just select the three items in the Project Plan window, and use “File: Save Special: ArchiCAD object” to save as a library object.


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

When you save the library object, make sure it is saved as an object, and not (accidentally) as a window or door. I recommend saving in Editable form, as you can look at the script and made tiny modifications to certain parameters like materials or pen colour without having to remake the whole portal. Otherwise, it could be saved as a Binary object, in which no further editing is possible, and this is sometimes a necessary precaution against certain bugs in ArchiCAD which spuriously reports rendering errors with Editable objects, but not with Binary.

Raised Computer Flooring Tool


HIS is a classic example of stretchiness resulting in a useful tool. It is done with Nested FOR... NEXT Loops. This object also reminds you of the usefulness of using VALUE scripts and a Master Script.

Raised computer flooring is a genuinely useful object – by arranging small stretchy rectangles of floortool, you can adapt to complex room shapes.

Parameters For this the only parameters that really matter are the total width and length dimension, the panel size and floor height. However, you can make the object more user friendly by adding in options, such as to leave out the panels. You also control the Materials. When you have more than one material in an object, you need to have them specified in the parameter box. When you have one (such as the pen colour here) there is no The dimensioning system here is in millimetres, although, note, need for this, as the user can control it from other that the GDL script is ALWAYS written in Metres, or if you wish parts of the Library part settings box. to write in imperial, with inch or foot markers (as in 2’-0”) Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery !Raised Flooring System - 3D !Legs FOR n=0 TO B+pansiz STEP pansiz ADDy n FOR k=0 TO A+pansiz STEP pansiz ADDx k GOSUB 100:!Floor leg DEL 1 NEXT k DEL 1 NEXT n

!Panels IF d3d=2 THEN FOR n=0 TO B STEP pansiz ADDy n FOR k=0 TO A STEP pansiz ADDx k GOSUB 120:!Panel DEL 1 NEXT k DEL 1 NEXT n

3D Script

!Master Script - feeds parameters

FOR... NEXT Loops can be !to both 2D and 3D scripts THEN d3d=2 based on distance, angle IF disply="Whole floor" or number. Here you can IF disply="Panels removed" THEN d3d=1 IF disply="Supports only" THEN d3d=0 do it with distance, although to get it to work numpana=INT(A/pansiz)+1 numpanb=INT(B/pansiz)+1 usefully, it is best to make panth=0.02 !Panel thickness the panelling extend be- jonth=0.01 !Joint thickness yond the A and B dimen- lgrad=0.02 !Leg Radius sions; hence the final di- VALUES "disply" "Whole floor", "Panels removed", mension is (A+pansiz), not "Supports only" A. If the panelling stayed within the AB dimensions, Value list in the Parameter Script the active hotspot that makes it stretchy would Avoid putting titles or comments into the get lost in walls or over Value script as they can behave erratically. Value Lists are best used for strings (‘abc’), other areas of floor. even though numbers are possible.


!Grid IF d3d AND NOT(simple) THEN MATERIAL lmat ADDz florhit-panth FOR n=0 TO B+pansiz STEP pansiz ADDy n BLOCK numpana*pansiz,jonth,panth DEL 1 NEXT n FOR k=0 TO A+pansiz STEP pansiz ADDx k BLOCK jonth,numpanb*pansiz,panth DEL 1 NEXT k DEL 1 ENDIF END:!----------------------------

100:!Floor leg MATERIAL lmat RESOL 8 CYLIND 0.01,0.04 CYLIND florhit-panth,lgrad ADDz florhit-panth-0.01 CYLIND 0.01,0.04 DEL 1 RETURN

120:!Panel psiz=pansiz-jonth MATERIAL pmat ADD jonth/2,jonth/2,florhit-0.02 BLOCK psiz,psiz,0.02 DEL 1 RETURN

Master Script is the best way to ‘parse’ a Values list script and convert the results into numbers. Internal parameters such as panel thickness (ones you do not want the user to change) can also be here. Master scripts should not exceed 10k in size or Value Lists do not work correctly (bug).

2D Script

Stretchy hotspot is marked by a cross hair


You could use just a Project 2, and the four primary hotspots (bounding box hotspots will not be stretchy). It is also helpful to write a small ‘Crosshair’ routine to tell the user where the A,B Hotspot is located. You can mimic the structure of the 3D script.

!Raised Office Flooring !2D Script !PROJECT2 3,270,2

HOTSPOT2 0,0 HOTSPOT2 A,0 HOTSPOT2 A,B HOTSPOT2 0,B !Crosshair LINE2 A,B+panth,A,B-panth LINE2 A+panth,B,A-panth,B

!Legs FOR n=0 TO B+pansiz STEP pansiz ADD2 0,n FOR k=0 TO A+pansiz STEP pansiz ADD2 k,0 CIRCLE2 0,0,0.03:!Floor leg DEL 1 NEXT k DEL 1 NEXT n

!Panels IF d3d=2 THEN FOR n=0 TO B STEP pansiz ADD2 0,n FOR k=0 TO A STEP pansiz ADD2 k,0 RECT2 0,0,pansiz,pansiz DEL 1 The fully written 2D script NEXT k rewards the time you DEL 1 have invested because it NEXT n speeds up Redraw in the ENDIF

Project plan.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Louvre Sunbreaker


HIS IS SIMILAR in some way to the Joist tool or the Computer flooring, in that it is stretchy and uses a FOR... NEXT Loop; but this operates as a mechanism. One can rotate the louvres, tilt the assembly and change the curvature of the blades. This could be used ona building which used mechanised louvres to respond to the sun path.

Parameters Two of the parameters are based on a Value List, for Louvre shape and for the design of the surround. The shape could be based on asking for a Radius, but it is more user friendly to offer a Value List selection. Group the parameters under two main headings and indent all of them so you finish up with a tidy settings box.

3D Script First the Value Lists are parsed to calculate some internal flags and parameters. Then Tilt and Pen. The louvres are laid out using a FOR... NEXT Loop, and the hard work is done by a short subroutine 100. By using a bPRISM, and making the radius variable, you can in effect get flat louvres.

Final settings box can be VERY neat and tidy!

!Louvre wizard !3D Script IF IF IF IF

fram='No Frame' THEN frm=0 fram='Arms only' THEN frm=1 fram='Frame surround' THEN frm=2 frm=0 THEN lwid=A

IF frm THEN lwid=A-frwid*2-lthk

IF louvc='Flat' THEN radc=lspac*100 IF louvc='Slightly curved' THEN radc=lspac*2 IF louvc='Very Curved' THEN radc=lspac/1.5 !tilt if required ROTx tilt This varies the curvature PEN pcol of the louvres TOLER 0.002 !Draw the Louvre Assembly This loop is based on MATERIAL lmat number, incrementing ADDy lspac/2 by distance FOR k=1 TO numlv ADDy lspac*(k-1) GOSUB 100:!Louvre The frame might better DEL 1 be done with a PRISM, NEXT k but I am trying to keep DEL 1

!Draw the Frame !first the Arms IF frm THEN MATERIAL frmat ADDz -frdep/2 BLOCK frwid,lspac*(numlv),frdep ADDx A-frwid BLOCK frwid,lspac*(numlv),frdep DEL 2 ENDIF

!Draw frame IF frm=2 THEN MATERIAL frmat ADDy lspac*numlv ADDz -frdep/2 BLOCK A,frwid,frdep DEL 2

ENDIF DEL 1 !Undo tilt

VALUES 'fram' 'No Frame','Arms only', 'Frame surround' VALUES 'louvc' 'Flat','Slightly curved', 'Very Curved'

2D Script

Because the louvres You could script this if it was always are flattish, you are to remain level, but as it might tilt, safer with TOLER for you can use Project2. curvature control, and 1mm seems best !2D Script things simple in this case. HOTSPOT2 0,0 HOTSPOT2 A,0 PROJECT2 3,270,2

!------SUBROUTINES ----100: !Louvre curved IF frm THEN ADDx frwid+lthk/2 ENDIF ROTz -90 ROTy 90+lang ADDz -lthk/2 bPRISM_ lmat,lmat,lmat, 4,lthk,radc, -ldep/2,0, 15, ldep/2,0, 15, ldep/2,lwid,15, -ldep/2,lwid,15 DEL 3 IF frm THEN DEL 1 RETURN


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Tips and Tricks Rendering


nti Aliasing: For quick on-screen rendering, always turn off shadows and lamps. Both require greater amounts of disk and ram and time. Avoid anti-aliasing, or anything that will slow it down. However, for quality rendering, first thing to restore is anti-aliasing. This ‘softens’ the pixels, that that thin or small objects are still drawn, whereas without anti-aliasing, they would judder between being drawn and being omitted. Hence they would look jagged. ‘Anti-aliasing’ means that it looks at the surrounding pixels and does a controlled blur, in which the colour of surrounding pixels are taken into account to produce a softer image – for example the outline of a roof against a blue sky. Higher levels of anti aliasing slow it down, but produce better results. For each pixel of the final image, four pixels will be calculated, and the final pixel will be averaged – for example a thin vertical glazing bar that is normally smaller than a single pixel would now show. This results in 4 times as much rendering time. As a rule of thumb, ‘Good’ anti-aliasing does not cause serious slowdowns in rendering, but ‘Better’ and ‘Best’ can delay rendering quite seriously. So use ‘Good’ most of the time. Anti aliasing procedures are improved in AC-6.5, with a slider to control quality (but only if in AC’s own rendering engine, and set to Best quality.


extures versus 3D: Textures are always quicker to paint than geometrically modelled surfaces to build. For example, a tree model could have thousands of polygons if leaves are geometrically modelled. However, a lollipop shape with a dome or sphere shaped leaf ball, and an alpha-channelled image of leaves mapped onto the ball will look almost as good and reduce the polygon count to less than a hundred. PI and Resolution: Computer monitors work at 72dpi (dots per inch), and if you want to see how an image is progressing always use 72dpi – no matter what the final image size will be. If your image is to be printed, do not be tempted to enter any other figure in the Photorendering settings box. Stay with 72, but make the number of pixels in the image larger. For example, if you want to print an A3 landscape image, that is 17”x11” (420x297mm) with a final resolution of 200 dpi multiply 17x200=3400 and 11x200=2200. Set the size of the ArchiCAD Render to 3400x2200 at 72 dpi. It doesnt matter that this is bigger than your screen. When it is done, quit ArchiCAD, open the file with Photoshop, Graphic Converter or PhotoPro, and you can resize the image to 17”x11” with 200dpi. You can also convert it to JPEG at varying levels of quality – always use ‘maximum’ if the artwork has to be presented. You can also scale the same file down to 340x220 GIF or lower quality jpegs for Web page presentation.


Comment, Preview and Labels T HE Comment field is a good way to document your object so that a user has a guide as to its purpose or to how it functions. If you are building investment objects (where you won’t be around to explain), the comment box is like a tiny manual – or a copyright notice. Place a Web address in there and objects may enable users to refer to a website (in future versions of ArchiCAD.) It has a wierd word-wrap mode, so you are best just to write it without carriage returns, and let it work out the wrap itself. It cannot scroll, so you cannot write much.


HE Preview Picture – is used to show what the object should look

like. You can place a picture from the clipboard straight into the Preview Picture Window – this could be one you made earlier with Artlantis. Everything you do should be equipped with a Preview image. Preview images can also be used in the User Interface dialogs (with AC_6.5). If you use a PC, your Preview image will become your icon in Windows. In the GDL Browser window, the Preview image is the main means of identifying the object.


ABELS – Every Wall, Roof, Floor and Library Object has a label assigned to it by ArchiCAD. This is difficult to write into (although you can do). It is possible for each object in the plan to be displaying its label.


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Planar 3D Elements P

LANAR 3D elements are very useful because they only generate two polygons, 1 top, 1 bottom; when it comes to rendering speed, the ‘polygon count’ of a model is all important (because AC has to calculate the line outlines and the shading values for each polygon.) CIRCLE, POLY, PLANE and RECT all appear in renderings – but LIN_ disappears. Whenever you would normally use a PRISM or a CYLIND, stop to think whether the same job can be done with a PLANE or a POLY or a CIRCLE.

CIRCLE is simply defined by its radius. Use it instead of thin cylinders.

LIN_ draws a straight line in 3D from one XYZ location to another; but only shows up in 3D views with Best contours.

ARC draws a curved line sector shape. The rotation angle goes in an anti clockwise direction starting from horizontal. Here, the start angle is 45 degrees, and it finishes with 100degrees – anti clockwise.

POLY the syntax is identical to that of PRISM, without a thickness. No holes or curved edges or masking codes are permitted. POLY must always be laid on the X-Y plane, so if you want a poly in an odd place and angle, you have to move the cursor there first.

POLY_ (Poly underscore) is similar to Prism underscore – it supports holes and curved edges. With prisms, masks go from 0 to 15, but with POLY_ you only need to know if the line is to be drawn or omitted – so one or zero is enough. In addition, by adding 1000 or other polylines, you get curved lines or holes. As a bit of adventure, I have shown you an example of a hole drilled in the Poly – this is similar to the procedure for holes in PRISM.

!Two-D elements !Syntax:- CIRCLE radius !ARC radius, startangl,endangl !LIN_ x1,y1,z1, x2,y2,z2 !RECT x,y CIRCLE 0.2 ARC 0.3,45,100 LIN_ 0.00,0.00,0.00, -0.15,-0.15,0.15 ADDz -0.2 RECT 0.3,0.3

!POLY Demo !Syntax:- POLY number, ! x1,y1, x2,y2, etc POLY 9, 0.00,0.00, -0.10,0.30, 0.10,0.30, 0.10,0.40, 0.20,0.40, 0.20,0.10, 0.15,0.10, 0.15,0.00, 0.00,0.00

URL in the Comment field It doesn’t do anything now, but in future versions you might be able to benefit by placing a URL (web address) in the Comment field of your object.

Example of POLY_ – an outline with the opportunity for curved & straight edges and drilled holes (round or polygonal).

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

Example of POLY – a simple outline with straight edges.

!POLY_ Demo w’ hole !Syntax:- POLY_ number, ! x1,y1,mask, ! x2,y2,mask, etc POLY_ 9+2, 0.00,0.00,1, -0.10,0.30,1, 0.10,0.30,0, 0.10,0.40,1, 0.20,0.40,1, 0.20,0.10,1001, 0.15,0.10,0, 0.15,0.00,1, 0.00,0.00,-1, 0.05,0.1,900, !Hole centre 0.05,360,4000 !Hole drawn


The GDL Cookbook 3 – Discovery

More Planar 3D PLANE is most useful, as you can specify XYZ locations of any points in 3D space and GDL will endeavour to join them up with a surface. With three points, you can do anything anywhere. With more than 3, you must ensure that the surface will be planar. If they are not planar, the whole surface may appear as empty. PLANE_ (Plane underscore) allows you to decide if edge lines are to be drawn or not.

!PLANE Demonstration !Syntax:- PLANE number, ! x1,y1,z1, ! x2,y2,z2, ! x3,y3,z3, etc.. PLANE 3, 0.20,-0.4,-0.2, -0.20, 0.3, 0.1, 0.25, 0.4, 0.1 PLANE_ 4, -0.3,0.0,-0.20,0, 0.3,0.0,-0.20,1, 0.3,0.2,-0.05,1, -0.3,0.2,-0.05,1

Imported 3D DXF files often get converted to a large number of PLANEs when read in by GDL.

More 3D Elements SLAB SLAB is very similar to PRISM, but far more flexible. You only need to define the XYZ points of the nodes – like PLANE. As with Prism, you define a thickness, but depending on the pitch, this is really a vertical height quantity, not thickness. Plain SLAB and SLAB_ are all one colour. The XYZ points are actually the points on the lower surface unless you specify a Negative Height. One problem with SLAB is that you need to be sure that the surface will be planar – or it may not render properly. It does not check for you. Also, if the pitch gets too steep, the ridge and eaves detail get very distorted. SLAB retains its sides perpendicular to the ground, or to the current XY plane – making it ideal for ramps, roof slabs etc. It is good because you do not have to move the cursor to its location, or Rotate the XY plane, as you do with a Prism.

SLAB_ SLAB_ is similar, but you can control the edges in 3D drawings. (However, all the edges in the illustration here still get shown in photo render.) SLAB_ does not appear to support the drilling of holes – you have to use CROOF, or PRISM_. SLABs do not support PolyLines.

!SLAB Demonstration !Syntax:- SLAB n,h, ! x1,y1,z1, ! ....xn,yn,zn SLAB 4,0.2, 0.0,0.0,0, 0.8,0.0,0, 0.8,1.5,1, 0.0,1.5,1

!SLAB_ Demonstration !Syntax:- SLAB_ n,h, ! x1,y1,z1,mask1, ! ....xn,yn,zn,maskn SLAB_ 4,0.2, 0.0,0.0,0,15, 0.8,0.0,0, 0, 0.8,1.5,1, 8, 0.0,1.5,1,15

With SLAB_, you can control the display of edges and edgelines, as with Prisms.

See your cursor!


ne tip that I often use myself is to plant a small object whereever the cursor is supposed to be. If you have a little one liner ELLIPS 0.04,0.01, you can copy and paste it as you work through the script. Put it in places where things 1.64

aren’t working out right. It plants a little bullet like object showing position and orientation. In 2D scripting, you don’t even get the 3 pointed star that you get in 3D, so you are in the dark. You can plant a CIRCLE2 0,0,0.02 always in front of you as you push out the script. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

CSLAB_ CSLAB_ is SLAB_ with the ability to set different materials for top, bottom and edge surfaces. CSLABs are what you get when you make an autoscripted library part using hipped roofs. The Materials can be defined by name, or by index number, or with variables. This is analogous to cPRISM. Because of the way it handles the edges, and because you do not have to lift or rotate the cursor into position, the SLAB family can be more useful than Prism.

!cSLAB_ Demonstration !Syntax:- CSLAB_ topm,botm,sidm, ! n, h, ! x1,y1,z1,mask1, ! ....xn,yn,zn,maskn CSLAB_ "Gold","Zinc","Ice", 4, 0.2, 0.0,0.0,0,15, 0.8,0.0,0,15, 0.8,1.5,1,15, 0.0,1.5,1,15

Standard Lamp Steal-poly, Revolve, Light

THIS exercise teaches 4 ideas: • The stealing of a Poly from ArchiCAD • Making it into a REVOLVE • Making a Lamp with LIGHT • Using a flag


rocedure: First, find the origin of the Project Plan window, draw a FILL object to trace the outline of the lathing pattern for the standard lamp. Make sure it is on or ABOVE the origin. Start from the centre of the base of the lamp. Now open a New Library Object – a ‘Lamp’, and open the 2D Script window, position it next to the Project Plan window. The trick is to open the 2D window by clicking on the little white button, not the main grey button on the button bar – so it’s a floating window. Now simply grab the edge and D-r-a-g the Fill from the Project plan to the 2D Script window – Hey presto! Instant GDL!

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Standard Lamp, continued

3D Script: Now cut the whole text of the POLY2B that results, and paste it into the 3D window. Delete the Hotspot commands that get dumped into the script. In the 3D script, convert it into a REVOLVE, removing the first and last X-Y point and reducing the number of points in the REVOLVE by 2. Notice, the syntax for the X and Y points in the Poly2B and Revolve are almost the same – only the header is different. The main mask is 63, as usual for solids. Now you have got the standard pole, it’s relatively easy to make the shade – but here the main mask for the object will be zero. This will make it hollow with open top and bottom ends – an open cone, in effect. You can have a small IF statement to change the material from ‘Lamp’ to ‘Whitewash’ if the light is ON or OFF. You could add material parameters to the parameter box in case the person using your lamp is using a Portuguese ArchiCAD and all the materials have different names. The height of the lamp stand is made parametric by applying a MUL command to the zzyzx parameter.

The Light: For simplicity, we are doing an ‘All round light’ (or general brightener. The LIGHT command starts with the Red/Green/Blue components, each of which is affected by the ‘intensity’ (G) followed by the proportions of the RGB components (D, E and F). See the way it is done here and copy that. For a general light source, shadow, radius and the three angles are zero. The distances are defined, and the brightness (intensity) governs the long distances and the fall off characteristic of the light. Place the lamp on a surface, and experiment with !Standard Lamp Photorendering to see how it performs. !2D Script HOTSPOT2 0,0 !PROJECT2 3,270,2 CIRCLE2 0,0,0.03 CIRCLE2 0,0,0.15 CIRCLE2 0,0,0.25 CIRCLE2 0,0,0.30 FOR k=1 TO 2+C*4 ROT2 (360/(2+C*4))*k LINE2 0.03,0,0.3,0 HOTSPOT2 0.3,0 DEL 1 NEXT k

2D Script: This is a series of Circles, but to indicate that the Lamp is on or off, you can have a loop to draw radiating lines. To save writing 2 loops, I have used C as a flag to decide whether to draw 2 or 6 lines, and the flag also calculates the angles between the lines.

!Standard Lamp 3D Script MULz zzyzx/1.55 ROTy -90 MATERIAL stmatl RESOL 16 REVOLVE 21,360, 63, 0.0, 0.159792, 1, 0.019831, 0.159792, 1, 0.019297, 0.144624, 1, 0.027216, 0.142644, 1, 0.043055, 0.093148, 1, 0.052954, 0.027813, 1, 0.062854, 0.027813, 1, 0.064833, 0.037712, 1, 0.088592, 0.06147, 1, 0.11037, 0.06543, 1, 0.136108, 0.06543, 1, 0.7756, 0.029793, 1, 0.7756, 0.039692, 1, 0.785499, 0.049591, 1, 0.799358, 0.049591, 1, 0.809257, 0.031773, 1, 1.16167, 0.047612, 1, 1.179489, 0.041672, 1, 1.189388, 0.015934, 1, 1.227005, 0.015934, 1, 1.228985, 0.000095, 1 !Lampshade IF C THEN MATERIAL 'Lamp' ELSE MATERIAL 'Whitewash' ENDIF REVOLVE 2,360,0, 1.20,0.3,1, 1.55,0.25,1 DEL 1

vertical post routine

Shade routine

Lamp making routine

!Bulb IF C THEN ADDz 1.3 RESOL 6 SPHERE 0.03 gb=G/100 !brightness index LIGHT gb*D,gb*E,gb*F,!R,G,B 0,0, !shad,rad 0,0,0,!alp,bet,angfall 0,gb*dist,(gb-1)^2!falloff DEL 1 ENDIF

Picture Objects - Alpha channels This model is a very important exercise in: • The PICTURE command • Using Photoshop to make the alpha channel • Creating the basic library object that can use any 32bit PICT or TIF file • Rotating the object to face the camera • Using photorendering for the finish


HE example used here is a bit of fun; I assure you that there is no montaging done – it’s rendered in ArchiCAD. The serious uses are as follows:

• • • •

People in buildings – populate models with photorealistic figures. Put pictures of trees onto flat planes, don’t model them in 3D. Pictures and decoration on walls give interiors more realism. Attach facades of buildings in urban models to avoid having to model them geometrically – rapidly create urban surroundings for your building.


Batman visited Thailand entirely free of 3D geometrical entities! This Picture Object provides you with a surface to which you attach an image. It is not the same as a texture. Textures tile themselves, and may have a random origin. An Image is a single entity.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Procedure First catch your lion – or person, or plant, or building facade – using a digital camera or scanner. Cutaway the background using the magic wand and eraser. It must become totally white. Use the ‘Channels Palette’ to create a new channel, which you can call the Alpha Channel. You must operate in 32bit RGB colour (even if your screen only supports 16 or 8bit colour). The Red, Green and Blue channels each require 8bits (hence 24 bits for 16.7 million colours). The 8bits between 24 and 32 hold the Alpha channel, which you have created. Select and ‘Cut’ the WHITE area in the RGB channel (using the magic wand). Click on the alpha channel (cmd-4) and ‘Paste’ the same area into the Alpha channel. With the White Area still selected, fill the selected area with BLACK paint using the bucket tool. Flatten any Layers, then Save the file as a PICT or TIFF with 32 bit colour, and avoid any form of compression, or you will lose the Alpha channel. For most Picture objects, 72 or 100dpi is enough; avoid high resolution scans. Important: Save the final image into your current Library, and Reload Libraries. If you are intending to do this with building elevations, a picture dpi of 60 dots/m For this, you need Photoshop, or any art software that can handle works well. This is a fair compromise between Alpha Channels – which can be used by CAD software for special sharpness of detail, rendering time, memory functions like transparency or bump-mapping. usage, library size etc.


The parameter box needs to know the name of the Pictmap that will form a picture – and it is unhelpful – no popup menu helps you; you just have to know the name. If the picture file is not in the library, you get very irritating error messages.Width (A) and Height (B) will stretch the pictmap to fit. In the parameter box on PCs, you must leave out the 3-letter suffix in the parameter box. i.e. fat_man.tif must be entered as fat_man. On Macs, you must put the suffix in!

3D Script

!Master Script

Masking: If the photo is a building facade, you may not want the !Location Awareness Check alpha channel to be made invisible, so the ‘mask’ has to be a choice. dkx=K~-X~:IF dkx=0 THEN dkx=0.001 The Mask modifier lets the user decide if the image is ‘see-through’ dly=L~-Y~ or solid. dmz=M~-Z~ Size: There needs to be a rectangular frame and the photoshop dd=SQR(dkx^2+dly^2+dmz^2)!Distance image will adapt to fit the size. The frame must be the same propor- azi=ATN(dly/dkx) !Azimuth tions or it will look distorted. A and B make the object stretchy. !Three-D Script Face Camera: Many 2D Objects such as people or trees look totally wrong if they don’t face the camera. It is vital to know how to width=A: height=B IF facecam THEN ROTz (90+azi-W~) turn the object round so it looks solid. You may not want this to ROTx 90 happen always – eg if it’s a picture on the wall, or a building facade; ADDx -width/2 therefore the user has to have a choice in the matter. If the object MATERIAL backmat SHADOW OFF has a rotation angle in the dialog box, it will never face the camera PICTURE pictmap,width,height,mask properly; so one workaround is to use 90+azi-W~ (W~ is the gloDEL TOP bal for object’s rotation angle.) If you have a rotated grid (in AC6) A bit of trial and error was required to get then this will not work correctly. the rotation angle working perfectly. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001 1.67

The GDL Cookbook 3 – Discovery

Rendering picture objects The rendered object is light sensitive, so check your sun angle relative to the camera position (or you can create misleading shading on the picture.) If the image is not to be silhouetted or transparent, you do not need to worry about alpha channels, nor about 32bit colour – for example building facades or pictures on walls. You can save files as PICT or TIFF in 8 or 12 bit colour, you can even use a modest level of compression. Make sure you reload Libraries after you save the Photoshop file into a library. By the way, if you didn’t ‘Flatten the Layers’ in Photoshop, it may not render. Once you get the hang of this, you can build entire models out of just the picture object! You can build whole streetscapes from this. One problem is that you will have difficulty copying these items across to Artlantis Render – they may finish up looking like flat boards. But then there are ways of bringing in Alpha channelled images into Artlantis. Another problem is that Alpha channelled silhouetted objects do not cast correct shadows. If SHADOW is on, you get just a rectangle(:-( so you might put a SHADOW OFF command into the script. For Graphisoft to write a Shadow algorithm that looked at the image would be difficult. But then if the Alpha channel is designated ‘transparent’ it should be made to work.

The Picture Object looks like this in 3D views. You should assign a Material like ‘Whitewash’ or ‘Glass’ to make it less obtrusive in 3D views.

The same 3D view looks like this when render ed. As the image could look distorted, you should offer a choice to ‘Face the Camera’. See the Voyager course for a discussion of Shadow Casting with Alpha Channels


2D Script


You can simply use PROJECT2, or you could use a LINE2 or RECT2 command. You should add Hotspots if the Picture object is easy to pick and stretchy. (If you make it stretchy, you could accidentally alter the rectangular proportions, and distort the image.) I have introduced the idea of ‘Helpfulness” whereby you can project the object onto the floor for the user to stretch, using ‘B’. It also names the file. To use TEXT, you should always define the text style. The idea of ‘px’ (an object pixel) is that it will work for very small or very large objects.

!PROJECT2 3,270,1 px=MIN(0.01,A/100) IF facecam THEN ROT2 (90+dazi-W~)+180 HOTSPOT2 A/2,0 HOTSPOT2 -A/2,0 HOTSPOT2 0,px CIRCLE2 0,0,px RECT2 -A/2,-px, A/2,px IF helpful THEN RECT2 -A/2,0,A/2,B HOTSPOT2 A/2,B HOTSPOT2 -A/2,B DEFINE STYLE "pictext" Arial,1,7,0 STYLE "pictext" TEXT2 -A/2,0,pictmap ENDIF DEL TOP

In Helpful mode, the Picture object appears to be laid flat on the ground for easy re-sizing, and its name is displayed – even though it is still standing upright. If you want to map a picture on to a curved or rough surface, there is a method! See the Voyager course


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Cutplane/Cutend CUTPLANE

is one of my favourite commands. It is much easier to make something larger than it needs to be and cut it down to size, than to build it up in a positive method. The more complicated the object, the more useful CUTPLANE becomes. Its greatest use comes when you need to form mitres at the end of extrusions. Without cutplane, it could not be done. I only use and only teach one method, which I call the Angle method. The other method, based on Vectors is to difficult to use.



CUTPLANE can be likened to a large spinning bacon slicer. You move the slicer into position, rotate the blade to the right angle, issue the !CUTPLANE Demonstrat’n !Syntax: - CUTPLANE angle !After you’ve made the object !to be cut you issue a CUTEND ! ADDz 0.5 CUTPLANE DEL 1 SPHERE 1 CUTEND

CUTPLANE command; now you must use DEL to get back to the origin. Next, build the model that needs cutting. If your model disappears, you may have forgotten to DEL correctly. CUTPLANE always cuts away what is above it, and leaves behind what is below. Sometimes, you wish to do the opposite, and cut away everything below the ground plane. For this, it is handy to spin the blade through 180 degrees with a ‘CUTPLANE 180’ command to leave behind everything above the plane.


For other angles (i.e. not around X axis), you do the swivelling yourself with ROT commands and issue a CUTPLANE.

Remember to do the correct number of DELs before building the object that is to be cut.


CUTEND At the end of the cutting process, the CUTEND

command is required to stop the blade spinning. If CUTEND is not stated, the Cutplane command will continue till the end of the object and you will get an Error report. Some models use many Cuts, and for EVERY Cutplane, you must have the right number of CUTENDs. It is annoying to GDL user that there is not some sort of CUT TOP command that has a similar function to DEL TOP – i.e. it would stop all cutting, and if there were no cutplanes in action it would not result in an error. You can also do a CUTPOLY which is similar to a PRISM, but it’s cutting instead of building. See later in the book. CUTPLANE needs to know the Material that you are using. If you do not issue a Material command before Cutplane, it will leave the cut face to the current PEN colour, not to the material of the cut object. Multi coloured models: You could issue a Material command, issue a Cutplane, then issue another Material command, issue another Cutplane... and so on. Then build the object to be cut. In this way, you can get multi coloured This multi-coloured model of the world models. can only be made by CUTPLANE, but there CUTPLANE uses a lot of memory, and if you issue a large are so many Cuts that if you do the whole world in one go, you could need over number of them, the model rendering will slow down, or 100megs of RAM allocated to ArchiCAD. you may even be told that ArchiCAD is out of memory. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001 1.69

The GDL Cookbook 3 – Discovery

Tapering tube – with cutplane


HIS MODEL is a component in larger steel structures. It is here because it is another example of : • The CUTPLANE command, used at angles • POLYLINES in a PRISM

CUTPLANE is used here to model the end of the main cylinder – there is no other way to get that shape.It’s done by moving the cutting plane to each end, tilting to the right angle, Cutting, then DEL back to the origin. This must be done before you make the 3D elements.

3D Script You must issue a Material definition BEFORE issuing Cutplane, otherwise the cut face adopts the colour of the current PEN. When you have done cutting, issue the CUTEND command, or the rest of the Library object will also be cut. You can write simply, CUTEND:CUTEND:CUTEND:CUTEND as a multistatement line. To economize on code here, the CUTPLANE is one single subroutine, and the script uses ADD, ROT and MULs to do the fine positioning and tilting. Flange: The Polyline in the flange is 1000, a tangential curve – the easiest one to use, with a 900, 4000 for the hole. Careful masking (by subtracting 2) is used to removed redundant wirelines on the curves.

2D Script This is a hingeing component of a larger steel structure and could be any-which-way up, so you have to script it in 2D as a Project2 command. If you were building a large structure with these, you could ‘encapsulate’ them once they were assembled. The Hotspots are in the 3D script for locating the centre of the holes, but you need the bounding box for generally locating the tube.

Don’t use Storey-0 for building Storey 0 always has to be at zero height, so if your ground floor is not at zero, start this on floor 1 with the correct height. Use Storey-0 for the landscape or siteplan. 1.70

!Tapered Cylindrical spar - 3D Script PEN pencol MATERIAL mat trad=tdiam/2 !tube radius traf=trad*0.95 !flange width slightly smaller clen=leng-tdiam!length of cylinder section IF cangl<0 OR cangl>90 THEN cangl=12.5 TOLER 0.002 !2mm !_____ THE PROGRAM ______ ROTy yangl !global command ROTx xangl !to position ROTz zangl !rod GOSUB 100 !Main tube GOSUB 200 !Bottom flange ADDz clen+tdiam MULz -1 GOSUB 200 !Top flange DEL TOP !return to origin END:!------------------------

100: !main tube with cuts ADDz trad GOSUB 110 MULx -1 GOSUB 110 DEL 1 !cut bottom ADDz clen MULz -1 GOSUB 110 MULx -1 GOSUB 110 DEL 3 !cut top CYLIND clen,trad !draw tube !cancel cuts CUTEND:CUTEND:CUTEND:CUTEND DEL 1 RETURN 110: !Make the cut ADDx flanth/2 ROTy -(90-cangl) CUTPLANE 180 DEL 2 RETURN

200: !End Flange ROTz 90 ROTx -90 ADDz -flanth/2 HOTSPOT 0,0,flanth/2 PRISM_ 6+2,flanth, -traf,-trad, 15, -traf, 0, 15-2, traf, 0, 1000+15-2, traf,-trad, 15, 0,-trad, 15-2, -traf,-trad, -1, 0,0,900, hdiam/2,360,4000+15-2 DEL 3 RETURN

!Tapering tube 2D Script PROJECT2 3,270,2 !Rely on the 3D Hotspots to !pinpoint the hole centres

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

The User Interface – part 1


OR ArchiCAD 6.5 and 7.0 users, the most noticeable difference for users of Library objects is the user interface (UI). The usual box of parameters with the scroll bar still exists, but it can now be organised into tidy groupings with hierarchical menus, bold titles and line spaces. First, the selection of objects is made easier as the object browser displays icons for each object. Second, it is possible to build a custom user interface that does

away with the traditional parameter box altogether and makes it possible to build objects that have the sort of interface you normally expect from a well written API add-on. You could also build a set of duplicate user interface windows in different national languages. Let’s go to the first of these improvements and look at how to organise the parameters tidily. The object ‘UI_Tester.gsm’ demonstrates most of the features of the new interface. It’s on your CD.

These are the dialogs we have been used to with earlier versions of ArchiCAD – now looking dull by comparison with what is available with AC6.5

Now, let’s get rocking! AS you build each parameter, you have 2 new options – you can have a Title which will be in bold type, and you can have an empty line (Separator) to give a linespace in the list of parameters. You also have three new buttons to touch on; the first one, with a cross (as in ‘fontui’) means ‘hide it’, in this case because it is ONLY to be used in the advanced User Interface boxes. The second button with an arrow means ‘indent the parameter name’, making the parameter hierarchically subservient to the nearest unindented above it. The third button with a large ‘B’ means ‘set parameter description to Bold’. By organising the box so that the indented parameters come under the Titles, you get triangular ‘rocking’ buttons, giving you ‘cascading parameters’ – you can make a neat and tidy job, reduce the need for the user to scroll down, and ensure that the parameters are logically grouped together – for example, 3D configuration, 2D symbol appearance. It is worth noting that if you use zzyzx to denote height this should now be at the TOP of the parameter table and not in any hierarchical group. When the object is saved and then viewed through its settings box, the height becomes one of the Infields, along with width and depth. There is no longer a Value List button – Value lists automatically activate if they find a valid script in the Parameter script. In the advanced UI, you can have Pictorial Value lists. It is possible to do away with the conventional parameters box. Put all of the parameters into a User Interface, make the UI appear first whenever the setting box is opened. The user then has to choose to use the old parameter list, unless you choose to use the Hide button to hide them all!

Title and linespace are two new parameter types

This is the user’s parameter box all neat and tidy and folded up.

This is the user’s parameter box with 2 of the groups opened up ready for inspection and use.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Compare ArchiCAD 6.5/7.0 This page lists the main improvements in GDL brought in with the issue of ArchiCAD 6.5, compared with 6.0. Many 6.5 users still work with the 6.0 GDL manual. GDL in 7.0 is largely unchanged.


2D scripting

• The Parameter building box is a lot easier to work in as you do not have floating palettes all overlaying each other (although you can have them floating if you wish it that way.) • Organising the Parameters box to be user friendly is easier with the opportunity to have Bold font, title lines, linefeeds, hidden parameters, lockable/ unlockable parameters, and cascading parameters. • Special characteristics of an object, window, lamp and so on may now be found by clicking on a button called Details (including ‘Hotspots on Bounding Box’) • The GDL Debugger, is still too baffling and prone to ‘Internal VM error’ when it tries to draw things, so the END statement is still the best way of putting breakpoints into a script. • Copy from Mac to PC without making .PLA Archives.

• HOTSPOT2 – can be followed by an ‘identifier ID’ code. Useful if the 2D view is changing in a complex way. • DRAWINDEX – defines the order in which 2D elements are drawn.

3D scripting • HOTSPOT – to remove the annoying tendency of 2D hotspots, when seen in the 3D window to be anywhere but where you want them! But you cannot see the 3D Hotspots in GDL’s 3D view, only in the Main model’s 3D view. • Extension of XWALL to allow Log building. • BEAM – has a syntax similar to XWALL, i.e. a lot more difficult to use than BLOCK or PRISM. But you can vary the materials of the faces. For creative programming one is likely to continue using cPRISM_. But BEAM will be the new standard for Autoscripted objects which have been constructed with the new Beamtool. The Beamtool has new and clever ways of revealing intersections with others and allowing themselves to be drilled (like Walls) or cutting slabs. In the autoscripts, these are done with CUTPOLYs. The Beamtool has many links to the ArchiCAD model through a host of new Global Variables for the purposes of listing, but it remains to be seen how the GDL writer can use this creatively. • SET SECT_FILL – this will satisfy one of the biggest wishes on ArchiCAD talk, of how to control the appearance (fill pattern) of objects when cut in the Section window.

If the User Interface Script is enabled, the user will see an extra button in the settings box, like this.


Properties • DATABASE_SET – if this command is placed in the MASTER.GDL file, it will define a database set containing Descriptor, Component, Unit, Key, Criteria and List Scheme files. Along with the fact that AC_6.5 includes a special manual for the Calculate menu, this command, and what goes with it must go some way to make the whole matter of Properties easier to use.

Parameters and Values • VALUES – the command is extended in power. If the user wants a choice that is not in the list, the CUSTOM keyword makes that possible. In addition, the RANGE keyword means that the user can enter a value falling within a range of values. VALUES commands are now written in the Parameter Script. • PARAMETERS – enables one to feed the object and the settings box with predetermined parameter values if the user makes a certain choice – rather as the CALL command sends a list of parameter values to a Called object. For example, it can redefine and display the new values of A and B. If, in a Car model, you select ‘MiniHatchback’ from a Value List of cars, it can set A to 3.1 metres, B to 1.6 metres and zzyzx to 1.4. If you select Limousine, it can change them to A=6.0, B=2.1, and zzyzx=1.6. Previously, if a change of object configuration was likely to result in the outer dimensions changing, one could not use A and B. • LOCK – This enables the script to lock out parameters which are not available as a result of a decision – e.g. if the user of a smart chair object selects the model without arms, the parameters relating to chair arm height and material will be greyed out. The parameter name must be in quotes. • USER INTERFACE Script – the GDL writer can build a whole new series of dialog boxes with images, buttons, and boxes which the user can fill in. In particular, Pictorial Value Lists can be built which add 100% more user friendliness than before. The UI is a profound improvement. The User Interface (UI) brings GDL closer to API capabilities, and of course will greatly strengthen anybody who has the will to program in API and GDL combined.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

The Magic of ROTx How to rotate objects in plan


HIS EXERCISE is an example of ‘tinkering’ with existing Library Objects. Students are always asking me for an easy way to rotate objects in the plan (around the X-axis). One of the slickest things you can do is to put a ROTx in front of an object and make it stand upright, or fit to a sloping site or floor. There are many objects in the existing libraries that are not usable on sloping sites, or in unusual uses. For example the ArchiCAD and the People and More cars all stand horizontally, and look quite silly on a sloping carpark or driveway. A simple ROTx or ROTy can make all the difference, even to Binary objects. For these, the command ROTx 90 or ROTx -90 or ROTx rotang at the start of the script can work wonders to an existing library object. Whatever you do by this method, do not forget to make the minor essential change to the 2D script, or you will not see the change except in 3D views. You can make shapes in Plan such as laying out a truss using the slab tool, save them as Library objects, and then ROTx them to the angle you want – this is easier than setting up the views in elevation if the angle is anything other than 90. Use ROTy if you want to lean objects in the other direction. The Mesh Tool will not allow you to make complex shapes with undercutting. However, if you prepare Meshtool surfaces on the level, put them into GDL (by dragging into a 3D script window) and then add some ROTx and ROTy commands, you can manouvre the surfaces to the right position, and join several together to make very complex objects. This is one of the techniques used in my Motorist Car object.

CUTPOLY, CUTSHAPE and WALLHOLE AC 5.1, AC 6.x and AC 7.0 provide additional Cutting commands which enhance the opportunities in 3D. With CUTPOLY, you can define a convex polygonal hole shape using a syntax similar to PRISM, and then drive it through the whole model, like the action of a ‘Cookie cutter’!! CUTPOLYA and WALLHOLE are improvements on CUTPOLY that allow Polylines. WALLHOLE acts only on Walls, so you have to imagine its effect when you

!3D Script !ArchiCAD Car !Modified Script

!2D Script !ArchiCAD Car !Alternative Script

ROTx rx ROTy ry


MULx A/4.538808 MULy B/1.809472 Binary 1

2D Script One important thing to note is that the 2D view of the object in the plan could be quite different as a result of your ROTx, so if you have made the angle a new parameter, use a script like the one above. If a rotation has been specified, the script forces a Project2 command to take place. If not, then it will use the existing symbol – this can be invoked with the Fragment2 command, or you could use a conventionally scripted 2D symbol.

are in GDL. You do not see the result until you do a 3D View of the main ArchiCAD model. The requirement to be convex is a real pain. Many holes in the 3D real world do not conform to this. Complex holes or edge cuttings have to be done by a lot of CUTPOLYs or CUTPOLYAs , all declared before the cut part of the model is built. Let’s hope that there will be a CUTPOLYB before long allowing complex hole-shapes. Examples of CUTPOLY and CUTPOLYA appear in exercises in the Voyager sections.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

CircleGrid – 2D


DL can be useful in creating 2D entities that help you to lay out models or drawings, but which do not have any 3D existence – I call them drafting aids – Dimensions, Grids and parametric furniture modules for example. CircleGrid is a simple example. It also illustrates the usefulness of the FOR...NEXT Loop used with angles, instead of distance or number.

Parameters You define your own requirements. In this CircleGrid – that was written in earnest for a project and not just for the exercise, there was a main circle and a minor one. Hotspots at each point allow one to drop objects accurately into position. The grid does not trace a full circle, so a sweep angle is specified. The text block allows one to know how much rotation to give the objects, and the inner circle gives secondary hotspots which make it easier to rotate the objects to line up with the radiating lines. The object is not stretchy, so A and B are not used.

2D Script Firstly, title your script, even a 2D one. ‘Ang’ defines the angular separation of each line in the grid. Place a Hotspot at the Centre – so you can pick it up. Decide if you want it made of solid or dotted lines. • A FOR...NEXT loop is used for the main routine. Rotating around the centre, each line consists of a LINE2 command, followed by ARC2 commands which place short lines to display the circle, and then Hotspots at the intersections. DEL the ROT2 command each time the loop is used. The deliberate error of 1/1000 degree is essential, or GDL makes tiny rounding down errors and miscounts the number of lines to draw. • When you ROT2 in 2D the positive direction of rotation is anti clockwise. • If Text quality is important, it’s essential to DEFINE STYLE first. If the text element contains more than one part, you have to construct it first, using something like ‘angstr’ in which all parts are defined as strings joined by plus signs. In this, you can concatenate ‘numang’ (the number of angles) as an integer string, an @ symbol, and then, to print the degrees symbol, you can use a ‘%dd’ method (see the manual to test this further). Try this and experiment with changing the number of digits to be displayed.

Shadows in section/elevation Try turning on the ‘Special’ menu (using ‘regedit’ on PC or ‘resedit’ on Mac, or the Alt-Control key at start up). There is a FANTASTIC option to turn vectorial hatching on in your sections/elevations thus eliminating the need to tediously hatch them up manually. 1.74

If either shodat or Font height is zero then the text will not print. Text is a fixed size in mm. !CircleGrid - 2D Script IF fan<10 THEN fan=10 IF fan>360 THEN fan=360 ang=fan/numang HOTSPOT2 0,0 LINE_TYPE lindot !Draw the actual grid FOR k=0 TO fan+0.001 STEP ang ROT2 k Use the routine LINE2 0,0, lrad,0 (below) in the loop ARC2 0,0,rhotm,-4,4 instead of this one, ARC2 0,0,rhot,-3,3 if you want to HOTSPOT2 rhot,0 avoid using ROT2 HOTSPOT2 rhotm,0 DEL 1 NEXT k !Show angular increment as Text IF shodat AND fontz THEN DEFINE STYLE 'angtext' 'Arial',fontz,1,0 SET STYLE 'angtext' angstr=STR(numang,3,0)+'@'+STR('%6.3dd',ang) TEXT2 rhotm,0,angstr ENDIF

ROT2 bad for your DWGs? Objects in drawings exported from AC65 or AC70 to DWG often behave unexpectedly in the 2D symbol – because ROT2 may cause problems. If you can use Trigonometry, you can often avoid the use of ROT2. Unfortunately it is a lot more difficult to think out. for example, use this in the Circlegrid: FOR k=0 TO fan+0.001 STEP ang LINE2 0,0,lrad*COS(k),lrad*SIN(k) ARC2 0,0,rhotm,k-4,k+4 !Avoids using ARC2 0,0,rhot,k-3,k+3 !ROT2 HOTSPOT2 rhot*COS(k),rhot*SIN(k) HOTSPOT2 rhotm*COS(k),rhotm*SIN(k) NEXT k

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Location-aware Capability


T is possible to give a certain amount of decision making capacity to the object. Use the CAR PARK BARRIER. The barrier lifts and drops depending on the distance from the camera. Thus, if you fly or walk through the model, the barrier will appear to be active. The same algorithm can be applied to: • • • • •

2D trees and human figures rotate to look full bodied to the camera The density of branches & leaves on trees can vary. People and car objects can simplify hugely when camera is far. Lights come on in rooms, Televisions change their image. Curved objects change their RESOL value to higher values when the camera is near, and reduce to as little as three when it is far. • Complex objects like Planar fittings and Louvres decide not to draw.

It works with Sun Studies and Flythoughs; with ArchiCAD6.x, it also works with VR Panorama cameras. Doors and Windows can open during an animation, but must do so based on frame number. They do not work correctly with ‘location awareness’. Distance or Time?: Other aspects of animation, such as wind turbines whose blades turn, buildings stacking themselves up, cars moving, human figures moving, sea undulating, yachts heeling, Doors and Windows etc are better done by using the global variable N_ (GLOB_FRAME_NR frame number in the animation) to determine the action – which is equivalent to TIME. The Location-aware routine uses Global Variables. ArchiCAD tells GDL the Camera location and the Object’s own location. By comparing the distance differences in X, Y and Z (a simple subtraction that works whichever sector the model or camera is in), you use a 3D Pythagoras calculation to reveal the real distance dd from camera. dkx is the difference between the GVs ‘K~’ and ‘X~’ – the object and camera positions in the X direction. The same idea applied in the Y & Z direction generates dly and dmz. An ArcTan (ATN) calculation reveals the Azimuth (or direction) by dividing the X distance into the Y distance. If there is no camera, e.g. in an axonometric or an elevation, you need a ‘get-out-clause’ to set a false distance from the camera. This is to avoid a ‘divide by zero’ error when calculating the azimuth. Thus the variable dkx is given a tiny value of 1 mm.

Parameters: Offer a Boolean choice, autoarmang, to activate Location awareness, and opdis for an operating distance. The user must define the point at which the object opens or changes. Here, the barrier will lift when the camera is less than 10 metres away. 150: !Check distance/angle dkx=K~ - X~:IF dkx=0 THEN dkx=0.001 dly=L~ - Y~ dmz=M~ - Z~ dr =SQR(dkx^2 + dly^2) !Plan distance dd =SQR(dkx^2 +dly^2 +dmz^2)!Distance azi=ATN(dly/dkx) !Azimuth LET rotarm=90 IF dd<opdis*2 THEN rotarm=45 IF dd<opdis THEN rotarm=0 IF dd>opdis*2 THEN rotarm=90 RETURN

These are examples of the actions that might result, once you know the distance Add this subroutine to the Car park barrier to automate the value of ‘rotarm’

The eye positions K~, L~, & M~ can also be called GLOB_EYEPOS_X, Y & Z, and the Object positions X~, Y~ & Z~ can be called SYMB_POS_X, Y & Z.

3D Script

Rebuild each Frame

150: Subroutine 150 calculates the camera distance and returns a value of the variable ‘rotarm’. It is possible to make the Car park barrier lift slowly based on the number of metres distant. It uses a number of IF statements to compare the actual distance with the opening distance, then decides what angle the bar should be at. It begins to raise the barrier when the user is twice the distance away, and at the chosen distance, the arm is fully up. HIS location awareness routine can be used again – keep it in your Scrapbook. I have done models where EVERY GDL component was location aware to keep the rendering time under control. Azimuth is a difficult calculation. Because objects could be in positive and negative quadrants, this calculation could result in inversion. There is an interesting and complicated procedure for 100% accurate azimuth which will have to go on another page.

This routine will work for still views with different camera distances. To ensure that this works during a movie flythrough, you need a REBUILD EACH FRAME to happen during animation. In AC6, this can be enabled in the dialog box just prior to starting a Flythrough. In AC5, this is only possible by enabling the ‘Special Menu’.(see Voyager course) I was told by a member of Graphisoft that ‘Rebuild Each Frame’ was added to AC6 as a result of my lobbying them to do it. If so, then Thankyou Graphisoft!


Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

People – outlines which face camera Idea and GDL from Geoffroy Magnan, article by DNC


HIS little object comes from Geoffroy Magnan of Belgium. It’s a useful little ‘People-object’ derived from my original Lioness Picture object. He has offered it back to me, as a technique to write up for the GDL Cookbook. It can also be used for shrubs/landscape. You can make your own figures easily. Scan some people or objects from photographs or magazines. Do not worry about Alpha Channels. Copy the scan from your scan software, paste it into ArchiCAD and place it on the origin. Resize the figure until it is the correct size for the people in the image. Using the Fill tool, draw the outline patiently around the figures. Do not do it too quickly, or two single clicks will be misinterpreted as a double click (closing the outline prematurely). In this case, 5 distinct outlines have been created. Open a new Library part, open the 2D script window (floating) and drag the outlines into the 2D.

!This arrives in the 2D script PEN 1 SET FILL "% 50" POLY2_B 6, 3, 2, 0.0, 0.0, 1, -3.386397, -0.390738, -3.82055, 1.519537, -0.955137, 1.345876, 0.607815, 9.768452, 0.0, 0.0, -1 HOTSPOT2 0.0, 0.0 HOTSPOT2 -3.386397, -0.390738 HOTSPOT2 -3.82055, 1.519537 HOTSPOT2 -0.955137, 1.345876 HOTSPOT2 0.607815, 9.768452 HOTSPOT2 0.0, 0.0

91, 1, 1, 1, 1,

!Simplify it to this and copy to 3D script POLY_ 6, 0.0, 0.0, 1, -3.386397, -0.390738, 1, -3.82055, 1.519537, 1, -0.955137, 1.345876, 1, 0.607815, 9.768452, 1, 0.0, 0.0, -1

The syntax of the two POLYs is so similar, you only have to modify the top line.

End note

!People outlines - Master Script !Location Awareness Check dkx=K~-X~:IF dkx=0 THEN dkx=0.001 dly=L~-Y~ azi=ATN(dly/dkx) !Azimuth VALUES "type" "1 Femme", "2 Homme", "3 Famille", "4 Couple", "5 Homme 2"

This location awareness routine omits the Z factor (unless you want your people to lean over backwards when the camera is above eye level!) The Value list could be in the Parameter script or in the Master script !People outlines - 3D Script PEN pcol MATERIAL matl n = SPLIT (type, "%n", nbre, reste) IF x_loc THEN ROTz (90+azi-SYMB_ROTANGLE) !W~ ROTX 90 GOSUB 100+nbre:!Make corresponding shape DEL TOP END !------------------------101 : !Femme et chien POLY_ 334, 0.023074, 0.31415, 1, 0.029777, 0.302984, 1, 0.036477, 0.291072, 1, 0.038707, 0.279906, 1, 0.038024, 0.266892, 1, !etc, etc. etc. !Hundreds of lines of the polys for all the !people shapes follow. Each one starts !with the line number according to their !order in the Value list, i.e. 101, 102, !103, 104, 105. RETURN

This shows you how to organise the Executive portion of the script. Put all the POLY_s into subroutines. !People outlines - 2D !People - 2D PEN pcol PROJECT2 3,270,1 IF x_loc THEN ROT2 (90+azi-SYMB_ROTANGLE) !W~ HOTSPOT2 0,0 CIRCLE2 0,0,0.25 LINE2 -0.25,0, 0.25,0 IF labl THEN ROT2 180 !Flip the lettering round DEFINE STYLE "STYLE_1" "Arial",2,5,0 SET STYLE "STYLE_1" TEXT2 0,0,type Adding the label ensures that you DEL 1 are getting the right variety of people ENDIF in your scene. The Line helps you to

Your finished people will only be flat 3D cutouts. However, if you: take the scans and cut out the backgrounds; convert background to alpha channels; define figures as textures; master COOR and VERT (in Voyager)... you can accurately plant the photographs onto the people outlines. Do this with trees and you can get them to know if the people are rotating cast realistic shadows. Two articles in Voyager (‘Cast correctly. shadows with alpha channels’) take this further. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001 1.76

The GDL Cookbook 3 – Discovery

Binary Hacking When you don’t have the time for code

by Dwight Atkinson MAIBC

Slices and Dice: Re-invent!!


ROM time to time, a shape can’t be created from regular geometry, or what is needed can’t be exactly predicted or designed. ‘Binary hacking’ explores the implications of shape within ArchiCAD. This messy, experimental technique results in form that responds to notion and feeling more than science. Many of the results obtained with binary hacking can be achieved with GDL commands like MUL and CUTPOLY, but not with any degree of intuition.

Binary hacking is visual: lay the piece down, stretch it, mash it, cut it. It is creative and instructive because it shows surprising transformations. Binary hacks allow form refinement in a more sculptural way than coding, or even accurate design. You could discover something exciting in the distorted form. As an object is stretched and re-scaled, the inherent ‘family of order’ in the piece is revealed. Once made binary an object or a group of objects saved as one binary object act as a block of infinitely stretchy and twisty plastic.

The 'Binary hack' can be distilled into three related processes STEP 1: Diagonal Distortion This is circular geometry stretched into a elliptical geometry with binary conversion. It makes things more graceful. When you have approximated the curved form you seek with conventional ArchiCAD tools [including objects made with ArchiForma or parametric GDL code], visualize the direction of displacement required. This might be a broad rotation, wild scalar distortion or merely a minor deviation. Time to play. 1: Save the component [viewed in the 3D window] as a binary object, rotated somewhat diagonally from your view azimuth. This adds a lateral displacement factor to the regular geometry of the object. When stretched, the object distorts obliquely in the horizontal plane. [Spheres become ellipsoidal]. The object is controlled separately in the vertical plane. If you need an elliptical ‘swoop’, or wish to flatten a radius slightly, reduce that scale component. To emphasize tilt, wildly exaggerate vertical size. Straight edges cannot be distorted; you can rely on straight parts to remain so.

Machina Metronoma: Chopped the top arc into a graceful form. Stretched and re-scaled vertically. (Inset, photo of the finished structure, as built.)

STEP 2: Slicing and Dicing The 3D cutting planes and 3D cutaway functions trim the object in any direction. The special ‘Use section tool in 3D’ command1, Marquee tool and 3D Cutaway deliver precise vertical trimming cuts. 2: Cut the distorted object up into components to mirror, stretch and save diagonally again. The relational integrity of the object remains; the object stays useful: hotspots can be linked to key points for dimensioning. [Sections through the distorted object must be exploded into line segments to build real life form work for casting]. There’s use for GDL here, as the materials should be controlled at the end of the binary script. Substituting ‘0,0’ for ‘1,1’ will allow standard material changes, otherwise the object ignores the object material definition.

The translucent wings at Kelowna Airport: Twisting and radical re-scaling of a binary wing element. See permutations. 1

See article on ‘Special Menu’ in Voyager

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

STEP 3: Re-saving the Iteration Each change should be saved in sequence. Pasting ‘Dwight’s Universal Rotator’ script into the evolving binary object simplifies future transformation (make the rtx, rty, rtz parameters too). These orientation transformations accompany vertical and horizontal displacements to evolve the next iteration of your sculpted piece. You can save your object in the same name as the previous (current one) unless you need to keep a backup of a previous stage.

Some Observations Symmetrical objects can be given a directional bias. Cut the object in half, save as a new binary object, put two together, stretch one, squish the other. If you want perfect symmetry, cut your starting object in half and flip a copy of the resultant trimmed piece. By trimming the object only where the surface angle is perpendicular to the cutting plane, no seam will show when you mirror for symmetry. Try – it’s Fun!

The Shadocaster: A series of trimmed roof planes saved binary diagonally, twisted and then radically scaled: used to indicate the various shadows cast in different configurations.

Note: The only way you can save a binary GSM is to view it in the 3D window first. Once made, the binary code is embedded in the GSM, so you have to add the ROT commands above the 3D script.

Sphere: Transform it to a surfboard

Wings: Permutations 1.78

Metronoma: Tops in process (above)

Shadocaster: Permutations

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Swivel Chair


HIS CHAIR is the ultimate 3D object of the Discovery Course. It is a very important exercise in: • Some of the more easy and useful GDL commands – CONE, PRISM_, CYLIND • Some of the more difficult but useful GDL commands – bPRISM, TUBE • More advanced GDL techniques – CUTPLANE, Polylines • Making the subroutines modular and using DEL rigorously

Note: If you are doing this on a Lift Off course, you have a tutor available to help. Parts of this exercise march boldly into Voyager territory, so if you are teaching yourself, do not try it until you have tried easier tasks first!

!Swivel Chair - 3D script

Parameters In this Exercise, the seat and back are fixed sizes, and parameters A and B are ignored. You can swivel the chair in the project plan window, so it is not worth making the chair swivelable by the user. Note that this parameter box is set out in Millimetres. If you are in the USA, you might have to set it in feet and inches!!

3D Script This is a highly modular, structured program, in which the entire chair is analysed into essential elements – and each element is solved in an independent subroutine. No matter how humble your object, try to apply this structured approach. Write in the subroutines, empty at first. The subroutines called in the executive script will build up the chair methodically, physical element by physical element. However, if you try to run this script before the subroutines have been written, you will get a ‘Subroutine not found’ error. So you could write in some dummy routines, just to avoid an error. Then gradually, you fill in the details. For curvature, we are using TOLER which gives good results when mixing items of large and small curvature. Making the leg and the feet 300: To make the leg, you need to make one foot first, and when it is working correctly, repeat it around the centre. Because there are 5 feet, you rotate them by 72 degs each. Each foot is complicated because each one has its own set of Cutplane commands, so make it a subroutine 350. 350: Each foot is to be cut 3 times, once for the top surface, and two mitring cuts where the feet meet. Declare the Material before the Cuts. (In reality, you would not need to mitre the feet because the cylinder of the leg covered the joint, but it’s a very good learning exercise with CUTPLANE and FOR… NEXT.) With PRISM_ (underscore) you can form a curved end to the toe. First make the PRISM_ as a square ended object, ready to mitre. Then change the end to a curve by changing 13 to 1013. Now go back and insert the cutting routines.

SHADOW ON PEN ink TOLER 0.002 GOSUB 300:!Foot of chair GOSUB 400:!Vertical shaft GOSUB 500:!Seat GOSUB 600:!Back END:!------------------------300:!Foot of chair RETURN 400:!Vertical shaft RETURN Create the Dummy 500:!Seat subroutines to avoid RETURN an error – you can fill them in later... 600:!Back RETURN

300:!Foot of chair MATERIAL mmat ADDz 0.05 FOR j=1 TO 5 ROTz (j-1)*72 GOSUB 350 DEL 1 NEXT j DEL 1 RETURN 350: !Toe of Foot MATERIAL mmat ADDz 0.05 ROTy 8 CUTPLANE !Top of toe DEL 2 !Mitre Feet ROTy -90: ROTx -(90-36): CUTPLANE DEL 1

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

ROTx +(90-36) CUTPLANE DEL 1+1 !still part of 350 !Foot shape PRISM_ 5, 0.05, 0 , 0.04,13, 0.2, 0.02,13, 0.2,-0.02,1013, 0 ,-0.04,13, 0 , 0.04,-1 CUTEND:CUTEND:CUTEND ADD 0.2,0,-0.05 !'Toe - little cone MATERIAL dmat CONE 0.05,0.03,0.01, 90,90 DEL 1 RETURN


The GDL Cookbook 3 – Discovery

Here is the basic toe element before cutting

Here the top surface has been trimmed down

350 continued: To give the foot more realism, the end is curved – using the 1000 polyline definition. Hot Tip for Polylines: The 1000 must come at the node after the surface which you wish to have curved, but the change of 15 to 13 must come at the node before you wish to have a smooth curve. 13 removes the visible vertical lines. Next, insert the CUTPLANE routine above the Prism forming the foot. You should attempt the routine 350 which mitres the foot correctly. You need 3 cuts altogether to make the foot into the correct shape. The mitring angle to achieve a spacing of 72˚ is 36˚ (half of 72˚). Just as in picture framing, you cut wood to a mitre of 45º to achieve a joint of 90º. Every CUTPLANE has to be followed by a CUTEND. Finally, The conical ‘toe’ is added as part of each foot. This could be a castor wheel, but requires more ROTs and ADDs.

Here, the centre point has been mitred

The five toes combined into a foot

Back to 300: Finally (if you haven’t already done this) having got 350 working, you return to subroutine 300: and spin the feet to produce five, using a FOR... NEXT Loop.

Levels of Detail You and only you can decide what level of detail and quality to display in your models. If you did not bother to mitre the toes, it would not be noticed, and it is done here only to teach you the use of CUTPLANE. The next section, the vertical shaft, would entirely hide the centre junction. 400: When the foot is perfect, block out the foot subroutine with a ! sign, and work on the shaft. The shaft can be done with a couple of CYLIND commands. Then manoevre the cursor to produce the adjusting knob. The heights of each part are calculated by working back from the seat heights and thickness.

400: !vertical shaft ADDz 0.10 MATERIAL dmat CYLIND sht-0.25-sth,0.03 MATERIAL mmat CYLIND sht-0.1-sth,0.02 MATERIAL dmat ADD 0.04,0, sht-0.25-sth-0.05 ROTy 90 CYLIND 0.02,0.04 !knob DEL 3 RETURN

500: The Seat uses the BPRISM_ command – but to make things more interesting, it also uses Polylines in the definitions. Enter the seat at first as an octagonal shape so that everything ends in 15, then experiment with the 1015 definition until you get it right. The 1015 should come AFTER the line which you wish to be curved. Change the 15’s to 13, and the vertical lines will be concealed. This speeds up drawing in 3D. When you first make the BPRISM_, it comes out upside down, but the MULz -1 reverses it vertically, so it finishes up the correct way up. By the way, you can enter a minus figure as the depth of the BPRISM. This is to get a tighter radius of curvature. 1.80

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery 500: !Seat ADDz sht MULz -1 GOSUB 550 !get the seat DEL 2 RETURN

600: !Back support MATERIAL mmat ADDz sht-sth ROTz 90 TUBE 4,7,63, -0.03,+0.01, 0, 0.03,+0.01, 0, +0.03,-0.01, 0, -0.03,-0.01, 0,

550: !Seat or Back BPRISM_ smat,dmat,smat, 5+4, sth, 0.8, -0.15,-0.20, 13, 0.15,-0.20, 13, 0.20,-0.15,1013, 0.20, 0.15, 13, 0.15, 0.20,1013, -0.15, 0.20, 13, -0.20, 0.15,1013, -0.20,-0.15, 13, -0.15,-0.20,1013 RETURN

The seat shape is contained in subroutine 550 because it gets called again later to do service as the back. To get the BPRISM to be curvy, you need to use TOLER, as the best result of RADIUS is still too rough, RESOL is too smooth. Experiment with TOLER. Here, 2 mm gives a good result for both the seat curve and the curved edge.

-0.10,0, 0 ,0, -0.05,0, 0 ,0, 0.20,0, 0 ,0, 0.23,0,0.02,0, 0.25,0,0.05,0, 0.28,0,0.30,0, 0.28,0,0.40,0

Profile XY points

Pathway XYZ points, with twists of 0 at each point.. You could work out these points by looking at a side elevation of the chair (with the back in position but no tube) and clicking in the section window along the lines of the tube.

MATERIAL dmat ADD 0.29,0,0.25 ROTy 90+6 !Adjusting knob CYLIND 0.02,0.04 ADDz -0.08 ROTz 90 !Back is Seat,but smaller MUL 0.8,0.8,1.0 GOSUB 550 !Back or seat DEL 1+6 RETURN

600: The Seat back support is using the very difficult TUBE command. Type it in and then try changing the locations to see how it responds. Look it up in Voyager. The Back Panel: The Back is the same bPRISM as the seat, but reduced in dimension a bit each way, using the MUL command. You can MULx, MULy or MULz, but if you just MUL, you can do all three directions in a single command.

TUBE - a dip into the deep end TUBE is a good way to get a continuous section moving through 3D space. Once TUBE is mastered it is one of the most useful commands – and a lot easier to use. With TUBE, you first define the cross sectional POLY shape that will travel through 3D space. You draw it on the X-Y plane, as if you were defining the outlines for a POLY2 command. Use a ‘masking value’ of zero for each point. Next, you define the path that it must follow – the XYZ points along its trajectory. The trick with TUBE is that the FIRST and the LAST location points along the tube are phantom points, there to tell GDL what angle to start mitring the first and last faces on the tube. You must remember to put a zero at the end of each path X-Y-Z location to tell it you want clean junctions – it is possible to twist the section and distort the mitre by putting angle values in there. If TUBE baffles you now, just type it in for now and enjoy looking at it. For later reference you will find more explanation and examples in the Voyager course.

2D Script Finally, you need a 2D view. Because the chair is quite complicated, a 2D script would make it display too slowly on the Project Plan. As the chair does not change in width or depth, and as it does not swivel, there is no need for a PROJECT2 command. Give it a PROJECT2 command temporarily, look at the 2D Full View, Select All and Copy. Open the 2D Symbol Window, and Paste to Original Location. Now you either delete the whole 2D script and the 2D symbol will take over; or you can replace the Project2 command with: FRAGMENT2 ALL,1. You will get bounding box Hotspots. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Tips and Tricks General Advice and warnings, all in one page As annually issued to my First year module at the University of Nottingham School of Architecture.



Making Library Objects




IBRARY organisation is the biggest thing you must get right. Know where your library is, and what it is called, and how to load it. Discard libraries that are not relevant to your scheme. Use ‘Load Libraries’ to sort it all out. • Avoid having duplicate libraries of the same name on the same disk, or even loaded in the project. You may have spent time improving a library object, only to see the old one come back next time, because you had the same object (the new and the old) in the same library, but in different folders. • When you move to a different computer platform (Mac<->PC) or transport your file on zip cartridge, you should save as ARCHIVE (using the .PLA suffix) which includes all your library objects in their right folders. • Archive does not copy across PICT and TIFF files (unless they are used as textures), so these files may have to be manually copied over. If you move computer but stay on one platform, the best place for your library is a shared FileServer so it is available from every machine, and where you cannot create duplicate libraries.

Building the Model


S you build the model, a very disciplined approach to using Layers, and storeys will save you much time and grief later. For example, you can hide the ‘Roofs’ layer, which will reveal the interior and let sunlight in. Or you can Hide the ‘Window Tracery’ or ‘Trees’ layer, which is slowing down your render. Or hide ‘Lecture room chairs’ while you render the exterior. Therefore, assign objects to layers as early as possible. • If, when starting a model, you find really wierd layer names, storey settings, dimensions, grid and materials (left there by the previous user), use the ‘New and Reset’ feature (by holding down ‘Alt’ key while you create a New file. This restores the usual default ArchiCAD settings. • Some people try to build multi storey objects or buildings all on the one storey. ArchiCAD has the ability to work with several stories. Bet you didn’t know that. (:-) • Set and Display a Ghost storey – makes it easier to trace the other storeys. 1.82

HILE developing the model, ALWAYS have your 3D settings as RASTER, not ANALYTIC, and contours as DRAFT. 3D windows also render quicker if they are smaller – there is no need for them to be 1000 pixels wide. • Never select Vectorial Shadows or contours unless your machine is very fast. • Photorendering (with ambient light and no shadows) is always faster than Analytic 3D drawing. • To see what a camera is looking at, you must first click on the camera and then select 3D view. Dropping cameras into the plan is quicker than tweaking the perspective viewing tool in the 3D Projections window. Another technique for storing views is to use the Navigation palette and ‘plant cameras’ when you see a view you like. • Putting a 'Marquee’ around the bit you are interested in will dramatically reduce rendering times, and has the effect of giving you instant sections and details. Using the 'thick’ marquee will show all stories, the 'thin’ one only shows the current storey. • Set your rendering window size the same as the 3D view size (or make it the same aspect ratio) – if not, you get strange borders in your rendering. • You may spend too much time on coloured renderings, and forget that ArchiCAD produces very good scale line drawings, in 2D and 3D – and that these can be brought together in Plotmaker. • Top quality colour renderings are best left to Artlantis – quicker and higher quality. But in ArchiCAD you can still do a lot with light and shade and use Photoshop filters like ‘water colour’ for added effects. In ArchiCAD, you could try some of the ‘fun’ rendering styles like Carboni or Toon. • If you have done a LOT of work with textures in ArchiCAD, avoid using Artlantis as you may have to start over again with texture positioning. • If you feel confined by the set of materials in ArchiCAD, try making some new ones – there are many spare texture images for wood, stone and brick in the ArchiCAD library – with these, you can make your own materials.

little bit of GDL scripting – with Cones, Cylinders, Blocks etc, will produce more manageable library objects than similar objects built with curved Slabs. • Converting groups of built elements to Library objects is a way of grouping them. In 5.1 & 6.X, you have a Group command, but making the group into a Library Object is more powerful, portable and editable. • Look around before embarking on complex objects, as they may already exist in the ArchiCAD or special objects library. For example, the Roof>Dome tool in ArchiCAD produces very clumsy, data heavy domes of many little roofs which fall apart if touched; whereas there is a nice little GDL Dome in the ArchiCAD Library that is more parametric and controllable. • If you script an object from scratch, it will not have a 2D symbol unless you create a symbol. Use the PROJECT2 command to view the object in 2D. If you have the time, write a short parametric script with CIRCLE2 and RECT2 that imitates the Project 2 command; then delete the Project2 command. If the object is not intended to be parametric, use the button in the Library object window to copy a 3D view to Symbol – otherwise it will take too long to regen the Project Plan. • Curved tracery etc, is best done with curved walls than with the slab tool. You can later control the curvature when it is saved as a Library object by inserting RESOL commands into the 3D script. • When you make library objects, give them distinctive names, so that they are easily found with the ‘Find and Select’ command. If you call your object ‘Column’ or ‘Cylinder’, you will probably find that next time you open your file, you open someone else’s library object which is different but has the same name. Use names like ‘Column_ntc’ which is unlikely to be confused with another. • For objects which are not intended to be stretchy, open the Library part, Symbol window, and put your own hotspots in – in places where it is easier to pick the object up.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

Rules of good conduct and safe passage in GDL • Number One! Always have paper, preferably a bound notebook (for looking back weeks later). • Think about the investment potential of the object – or is it really a one off? • If it’s a one off, then dirty, brief coding may suffice. • If it’s an investment, you need to revisit, tidy, improve code, leave it for others to finish: so write it well. The following remarks apply to ‘investment’ models. Read on. Philosophy • You might make an object model that will be suitable for the immediate purpose – but is there any chance you can think of it as a Tool that could be used again? • Are you making an object for others to use in the office, perhaps long after you have departed? How much ‘idiot proofing’ do you need to build in? • How ‘open’ is your code? Will others be able to repair it?

Structure Sorry for repeating these points, but they need to be drilled until they become second nature. • Structure the program rigorously – every physical element of the model should be a subroutine. • Use the Master script for calculation and preparation work. This leaves the remaining scripts to focus on their jobs without clutter. • Subroutines must always return the Cursor to the same location as where it started – so that any element of the model can be omitted without destroying the remaining model. When you exit a subroutine, you get the 3D cursor to the same place by using the correct number of DELs. • Remember that a few well scripted super objects (that can be changed parametrically) are far more efficient in use than a profusion of different but similar objects.

Typography and Layout • Document the program clearly – use ! marks for ‘Comment’ statements; never forget to do this at the start of all subroutines. • At the start of the script, put the object name, the date, and your name. Plus any further information that could be useful – all hidden behind comment markers (!). • Be disciplined in your typographical layout. Always use UPPER case for COMMANDS and lower case for variables and comments.

• Indent Cursor movements by at least two spacebar taps. Indent DELs and NEXTs. Indent the XYZ dimensions in PRISMs and TUBEs. Line up commas in Prisms etc. • Leave plenty of space (carriage returns) and rows of ------------------’s between sections. • GDL ignores carriage returns in almost all cases, so that XYZ coordinates for prisms, tubes etc can be written on separate lines, providing you end each line with a comma. This looks cleaner than trying to write on one line.

Maths • Don’t be scared of maths problems – remember, you only really need to know Pythagoras’ theorem and the SOH-CAH-TOA rule of trigonometry. • Use names for your parameter variables that make sense – like ‘length’, ‘width’, ‘spacing’ etc. Never use a command word, like ‘revolve’ or ‘prism’ or ‘del’ or ‘log’ for a variable, or any word that might be used in future versions of GDL – like ‘read’, ‘frame’ or ‘wend’.1 Use single letter variables only for Loop counters.

Development of the Script • As the script develops, keep putting ‘END’ after the bit you have just done so you can keep track of the 3D cursor location. Very early on, write an END statement so you can start making subroutines. • Block off working part of the script when you debug parts which don’t work, by Commenting (!) subroutines, or by putting in temporary ‘END’ or ‘GOTO’ statements. A temporary END enables you to see where the cursor has got to. • If you use global MUL, ROT or ADD statements, be careful not to DEL TOP during the program. • Use temporary PRINT commands to see if the results of calculations are correct. 1 Since I first wrote that in Cookbook 1, many of the words I suggested came into use in 6.5 so I have had to think of some new ‘unused’ words.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Good scripting practice • Never use GOTO as part of the script unless absolutely forced. IF... THEN... ENDIF or Subroutines are the best way to avoid using GOTOs. • Avoid multi-statement lines (separated by colons). like ADDz 0.1: ROTy 90. No economy is achieved by doing this. It is much more difficult to debug later. • Use FOR... NEXT Loops to speed up repetitive modelling. Consider using REPEAT... UNTIL or DO WHILE... ENDWHILE which offers more flexibility. • When you have to use a TUBE or REVOLVE or COONS or similar, use a PUT routine first, to assemble the parameters in memory. It is easier to dump the XY locations (using GET(NSP)) into the TUBE if you have done all the arranging beforehand. • Make frequent use of the swivelling 3D views in AC6.x to verify the shape of models. • Don’t panic if you get error messages. There are some bugs in GDL, but errors are 98 percent YOUR fault, not the computer. A little bit of analysis or simplification of your script will reveal the error. • If using objects first created with the wall/slab tool, make sure you make them on the main model’s Origin in the ArchiCAD floor plan. Use ‘snap to grid’ to get clean looking scripts.

User Interface • Try to imagine how your ‘user’ will enter data. Write the description of a parameter with the user in mind. Can the user understand what you are asking? Radii are always best entered as Diameters and then converted in the script. Is the number you require a Dimension, a ‘Real’ number or an Integer? • Use a Value List whenever a choice is required. This can reduce the risk of errors as it forces the user to enter valid data that doesn’t need error checking.

Quality Control


HEN you have made an object or a library for others to use, put it through a series of tests to ensure that it meets good standards. If you wish to transfer an object or a library of objects to another user, the safest way is to do a ‘Save Special’ from the File menu and save it as an Archive. If your object has macros and associated image files, you may have to tick the option boxes to include all of the loaded libraries. If this is so, ensure that the floor plan you are using only contains the library that you wish to transfer. If you happen to have the entire ArchiCAD library loaded at the time, your archive file could exceed 100megabytes!! Let’s assume that you have saved the floor plan correctly with the library into an archive. Transfer it by floppy or zip or email to another machine preferably a Mac and then a PC, to make sure that the whole thing unpacks correctly on both machines. The library objects should be saved in the correctly named folders and they should all show in the newly created floor plan. • View the floor plan and check that they are all there. Perhaps you can write an instruction text file into the floor 1.84

• Consider a Pictorial Value list, using the User Interface in ArchiCAD 6.5 onwards. • If you wish to use a Boolean parameter, make sure you frame it as an ON or OFF question. If the choices facing the user are more than two, use a Value list. • Alway put a picture in the Preview window.

2D scripting • Use the PROJECT2 command if the model is changing in 3D so much that it cannot be scripted. If you are able to, use 2D scripting. Turn PROJECT2 on to make sure your script is working. When it is working correctly, turn PROJECT2 off. • Scripting the 2D view for complex models will save redraw time in the main floor plan, and reduces model size. It’s not difficult to do once you have mastered the art of 3D scripting. • If the model is parametrically variable, the same structure as you have in the 3D script can be followed. For example, use the same subroutine numbers. If it’s exceedingly complex and parametrically variable, find out how to use FRAGMENT2, or script it fully in 2D. • If possible, use EXTRUDE in 3D scripts instead of PRISM as the parameters can be copied and pasted to the 2D script and easily changed to POLY2_. • Stretchy objects (using Hotspots on A,B) are useful and friendly to the user, and can reduce the number of parameters that the user must fill in. Stretchy Hotspots must occur at the start of the 2D script or the object will stretch but not shrink correctly. • You can use TEXT2 to ensure that objects label themselves correctly – although you need to DEFINE STYLE of text to do this well. If you autosize the font height to fit the object, it will be free from plotting scale problems.

plan on the use of the library. You could label each object, and put boxes round groups of compatible or matching objects. Objects which have more than one 2D representation should be placed enough times to show all the 2D views. • Check the ‘Missing Library Parts’ list to make sure that you haven’t lost any. Check that you haven’t included library parts that you didn’t want included. • Check the settings of each object to reassure yourself that the parameter descriptions look right, are in the right language and that the 3D view displays correctly. • Check that all objects have an icon in the browser (if not, they need a Preview image). • Make sure you have saved each object with sensible default values. • Delete ‘cache’ and other unwanted binary files like .gs& files. If your library objects have to work in listing, then run some listings to check that they display correctly. Delete section/elevation views from the floor plan. If you are quite happy, you could re-archive the file and it is ready for sending to the recipient.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

GDL Case Studies Graeme Mair <> have been using ArchiCAD since version 3.4. Over that time I have made numerous objects some of which were parametric (sash and case window with cill and angled ingoes for example) but mostly one-offs using the wall and slab tools etc. More recently as a result of reading the GDL book that used to sell a few years back and as a result of your own GDL Cookbook, I now produce objects for use by 7 other people using ‘structured programming’ as advocated by yourself and have found this allows me to come back to an object at a later date to modify and enhance it without having major headaches for me trying to workout how I put an object together. The other benefit of being ‘structured’ is that I can add features to an object which already be in use by others but not mess up the object for them. Some examples.... - A Tree symbol with 3 versions of 3D object, 4 different 2D symbols and in addition with or without 2D fill and tree grille. - 2D North symbol that rotates to match ArchiCAD Sun position. - 3D column (based on ArchiCAD’s Cylinder_Distort object) Makes use of RESOL and POLY2_A to both create the 3D and 2D symbol that has 6 variations of polygon shapes from triangular through to circular. The object can be viewed through stories by controlling a ‘height visible’ parameter. - A 2.5D Lift object with options to show activity space, Lift Shaft or just hotspots showing shaft position. This one is still being developed because I want to have a option to choose from BS lift sizes. - 3D Curved Kalzip roof which works out how many ribs it requires for a given overall size. The object can also tell you what radius of curve has been created from the combination of plan size and eaves to ridge height. - 2D parametric Car Space object with options of displaying area required for disabled space requirement and show a car in the parking space. - 2D Car Elevations: this object uses 6 alpha channelled images of elevatitions of cars that work in the section window or in 3D model photorenderings. There are more but I had better stop now cos I’m going on to much! Thanks for all your efforts in promoting and encouraging the GDL /ArchiCAD cause.


Evangelo B. Kalmantis <> have been using ArchiCAD since 1991. Initially, I found the tools sufficient for most projects, but as I developed my skills, I realized that I was becoming somewhat limited by them. Within a year, I realized that there was an entirely new universe of modeling possibilities if I could only tap into the power of GDL. Having no programming knowledge to speak of, this was a daring aspiration at the time. To my surprise, I found GDL rather easy to learn, that isat the basic level. The rewards far outweighed the effort, compelling me to delve deeper into it.


Chris Hough <> have been using Archicad for over 4 years now, starting with 4.5, and have made extensive use of GDL. At first, I was using it to make 2D parametric library parts, such as drawing titles where you could change the text by opening the dialog box. Then I moved to making parametric Sheet Title blocks, some with company logos, some even with the Architect's seal on them. Again, they had editable text, and would either resize to the scale of the drawing, or allow you to enter in a different scale if you wanted to plot at a scale other than that of the drawing. They also included a date stamp for automatically giving the date when plotted. Lately, most of my current firm’s work is residential, and I have been making custom parametric 3D eaves to handle edge conditions in the model. To facilitate the virtual building concept, I have used the masking feature to hide the joints between the edge of the roof and the edge of the objects, to reduce clean up time when going from 3D model to 2D lines. Of course, they are stretchable with custom mitered edges, custom roof pitch for ‘swept eaves’, and one allows you to define multiple roof pitches for gabled conditions. I have also used the Revolve statement to make the same profile available in for curved roofs. I have yet to sell any parts commercially, although I am thinking more and more of heading in that direction. I've found the custom arched top windows and window surround objects to be my current challenge, and probably the most difficult parts I’ve made to date, mostly due to the nature of the formulae needed to make them truly parametric. I also trying to use Neil McCann’s technique for using CALL statements for a single ‘trim’ object to have multiple profiles.


Duane Valencia <> GDL is the most EFFICIENT way to achieve parametric objects. If you want the power of what parametrics has to offer, then you have to pay the price. And the price is really time. Ok, it's not what ARCHITECTs expect to do when they go to work but then neither is attending a 2-day seminar about FIRE DOORS, but if you want to know what's going on, you have commit to a certain amount of "upfront" time.

Today, I have a personal library which is constantly evolving and growing. It consists of vehicles, letter signage, guardrails, exterior siding and panels, special doors, lab equipment, office equipment, modular furniture, religious elements and ornaments, special geometric building blocks and classical columns, all of which are parametric. Without GDL, I would not have been able to create these forms in ArchiCAD. I would highly recommend learning GDL to any ArchiCAD user at any level.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Case Studies: continued

Tips and Tricks Monitor and Card questions

From Conrado Dominguez <> irst of all, the organization using ArchiCAD must be committed to the use of AC 3D capabilities, otherwise GDL is no use to them; in such a case, the use of AC will be comparable to using a power boat with oars. In our case, we are half way committed. We use AC 3D capabilities in the initial stages (design evaluations, mass models, selected views, etc.,). Very early in the game, we realized that AC cannot generate every 3D component needed for a realistic representation of any given project. At that point, we begun a modest effort of creating objects with the use of slabs, walls and roofs. We still use this technique because is it quick to implement and productive. However, these parts are not parametric and once the project is completed, they get forgotten and buried in the Project Library, not to be reused again. We are a small office (7 AC stations), so we have no formal training procedures for training. When one of us discovers, or learns a new way to do things, we pass it along. I regret being the only person interested in GDL. Why? I find it challenging. My first incursion into it, consisted of back engineering some two dimensional symbols found in the AC Library. I remember displaying the 2D script and experimenting with the different code lines, introducing changes to them and observing the effect of those changes. This was a very slow process but a good learning experience. Nevertheless, I realized that this method and using the GDL manual as a reference was painfully slow. When I tried to venture into 3D scripts it was a nightmare. At this point, someone recommended the GDL Cookbook which I purchased and gave me a clear and methodical guideline to create scripted Library Parts. I confess that the learning curve was steep, at times frustrating, but at the end very rewarding. The first challenge, in my opinion, consists of identifying an object that will be extensively used in a project and possibly used in projects to come. In my case I was able to identify some railings that we seem to use over and over again. The height and length varies, the picket spacing and intermediate posts always the same. Now, it is very satisfying to pick this Library Part, insert it over and over in our plans (Balconies, exterior exit balconies, etc.), and ready drawn in Sections and Elevations. The great thing about it is to realize that with very little effort, more parameters could be added, such as different base, size of pickets and pots, size of end, top and bottom rails, etc. SO MUCH TO LEARN, so little time!!. From a management point of view (I am not part of it here), it may be better to rely on outside help for custom parts. From the user point of view (my own in this case) comes the satisfaction of learning the use of this tool and its final product, and to remember that whatever we learn travels with us no matter where we decide to go.



From: Einer Mortensen <> 1. I am thinking of getting a Mitsubish Diamond Pro 2040 w , does anyone have any experience with this monitor? 2. Are there any other recomended monitors? 3. What graphics card should I get? 4 Do any cards improve the 3D performance of AC? From: "Laz" <> The Mitsubishi monitors are good. The Sony, Phillips Professional and Apple 21" monitors are all good. Video cards? – Stick with Matrox Millenium. I believe Graphisoft benchmark ArchiCAD on the Matrox cards. The G400 dual head is worth noting. they are good cards and later if you want you can attach a second monitor. ArchiCAD doesn't rely that much on 3D cards( i.e. you would be wasting your money) - it needs raw processor speed. Get the fastest processor you can afford and a Matrox card.

Light through walls From: Drazen Slacanin <> I am preparing a rendering of a house interior at night. I only want one room to have a light and leave the rest dark. However, the light seems to shine through the walls and lights up the neighboring rooms. I even tried to export the model to Art*lantis 3.5 and the same occurs. Is that an AC modeling error or did I miss something in the setup menus (all the settings are at highest quality and I have the boxes for casting shadows by sun and lights ckecked). From: "LMH DESIGN" <> Glad to see that you are using Artlantis. There you have complete control over a) whether lights cast shadows or not, and b) whether individual materials cast shadows or not (in the materials list). Delete the 'sun' and fine-tune the rest till it looks right. From: Drazen Slacanin <> Playing around in Art*lantis with the lights is definitely a way to solve my problem. However, after playing around with different kinds of lights, I found out that the problem doesn't exist with every type of light. Also, unchecking the ambient light in the light-menu seems to help.

Modules – another type of ‘object’


f after all this, you still still don’t want to save or write things as Library parts, you can always use Modules. Make a Module by selecting your area of interest – a bathroom layout perhaps, and either Filemenu/Save as Module, or just drag it off the drawing onto the desktop, give it a name and put it into a folder. Modules can be ‘hotlinked’ back to a project file. The advantage of modules is that you get back your original material, whereas a group such as a room layout are encapsulated if they are in a Library part and cannot be separated or reused. You can even open a module as if it were a project file.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 – Discovery

GDL Cookbook : Questions to ask yourself


F YOU are on a course with tutors available, you should perhaps work in pairs, or have a seminar first to plan how you would set about doing these. You should use paper to draw out your ideas. A bit of planning will save you time during scripting. For example consider: • How can the model can be broken down into elements? – sketch it freehand. • Which 3D commands (in GDL) would best achieve the result? • Who is your ‘User’? – will you need to check input errors? • Where should the model’s origin be? • Can you take advantage of symmetry? • Are there hinging elements? • Does it want to be stretchy? • How parametric should the model really be? • What elements are repetitious and can be done with loops? • What maths or circle geometry problems are involved? • You are designers! Therefore, is your model well designed etc? If you are by yourself, this is a test to see how you thrive without the benefit of a tutor to help you through – just the Cookbook and the Manual!

Modify Library Objects

External cycle or handrail bar

RAW out a Slab in the Project plan, and then make the Slab into a library object, which you can now open and view. Now copy and paste the X,Y locations to write a few mini scripts which do things like using the points for a bPRISM command, or putting a pattern of Hotspots into the 2D script, or locating a number of round columns/ posts at the points on the slab.



Monopod Circular table

SLR camera

Desk Worktops

HIS circular table should be paramet ric in diameter and height. The leg should look stable, so you may use Cone or Revolve to form it (not Cylinder). The table should perhaps have a chamfered edge. Would you be able to make it stretchy and non circular (ie oval?) Can you do a matching 2-D script? If so, the line of the central circular support should be shown with a dotted line.


LTHOUGH this is too small to ap pear in one of your architectural models, it is a good exercise in using PRISM, CYLIND, REVOLVE, and RULED. Draw it freehand first, to decide which elements you will include. You could ask the user to specify the angle of the lens – from 28mm to 200mm, this will have an effect on the length and diameter of the lens mechanism. For 2D just use Project2.



Window or Door

Tempietto / Bandstand



sing scripting (not the old slab method), make yourself a door that can be opened and shut in 2D and in 3D. Use PRISM or BLOCKs for the Door. It should be able to change material, and have a scripted 2D symbol. If you are really bold, then offer the choice to glaze the door, and have a choice of door handle or knob.



AKE a TV or monitor with a slightly bulging, not flat screen. Trick is to use a very flat ELLIPS, then use 4 CUTPLANES to cut it to the rectangle of a TV. Then mount it into a PRISM with the rectangular hole in it. By inserting the script for a picture object, you can form an image on the screen.

ECIDE whether is it all curvy tube, or two uprights and a handrail. If it’s to be a smart object, give the user the choice to make it either. If the rail length is bigger or smaller than the uprights, will that change the junction detail? It must be a ‘stretchy object’ – conforming to the dimension A; it could be 2D scripted, to save drawing time. Can you make it error-check to ensure that as it stretches smaller, the curve radius can be modified?

SE Cylinders for the base and ELLIPS for the dome; individual columns should taper; think about a way of making the column bases and capitals, and use a FOR..NEXT Loop to distribute the columns. For the purpose of the test, make it parametric in height, number of steps and columns (and perhaps column fatness) and colours. Can you make it stretchy? Can you also script it in 2D, so it draws quickly? Do not bother with complex capitals – use a short CONE or no capital at all. Remember you need to find ways of varying the resolution of curved surfaces.

Hewi style door handle set


HIS uses tubes and cylinders, and could be a subroutine of something you might add to a door design – it could be CALLed. If it is to be called, reduce the parameters to the minimum – size is fixed, only colour is required.

ESIGN an L-shaped desk worktop that has a curved internal corner. The sides of the L can either be 800mm or 600mm. Assume a constant thickness of 30mm. The length should be 1200mm in one direction, and 1200, 1400, 1600 or 1800 in the other. If you really want to challenge, you can make it stretchy to those sizes. when you drop it into the Project plan at a height of 0.00, it should automatically be at desktop height of 760mm.



AKE a stretchy 2D Grid tool that can vary the spacing of the verticals and horizontals. If you are still a ‘Discoverer’, have a look at the task list that is at the beginning of the Voyager Course. Some of those tasks may appear to you to be something that you now feel ready to tackle.

Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001


The GDL Cookbook 3 – Discovery

Appendix Things that didnt quite make it into the main book

Azimuth for Location awareness In the Location Awareness using the Global Variables, there is an ambiguity about the final true azimuth. Applied to people and tree objects, you do not mind if objects flip 180˚ as that merely helps the randomness to look more authentic. But if you need accurate rotation, this routine from Frank Chin of Brunei provides a fix. It is more complicated than the ArcTan of the quick and easy method – but it works! Frank writes: Below is the routine that I used for finding the bearing of a line from Point 1 (x1, y1) to Point 2 (x2, y2). This can be adapted to be a subroutine to calculate many different lines in a shape. !Test of Frank's Azimuth algorithm !2D Script PEN ink HOTSPOT2 0,0 HOTSPOT2 x1,y1 HOTSPOT2 x2,y2 CIRCLE2 0,0,0.1 !Origin LINE2 x1,y1,x2,y2 !Line itself CIRCLE2 x1,y1,0.02 !Start CIRCLE2 x2,y2,0.01 !End DEFINE STYLE 'angtst' 'Arial',4,8,0 SET STYLE 'angtst' TEXT2 0,0,angla !Label ARC2 x1,y1,hypo,0,angla !AngleArc

!FINDING BEARING OF LINE - Master Script dx=x2-x1 dy=y2-y1 hypo=SQR(dy^2+dx^2) !Hypoteneuse sinq=dy/hypo cosq=dx/hypo !angla is the angle the line !makes with the horizontal X-axis IF dx=0 THEN IF dy>0 THEN angla=90 ELSE angla=270 ENDIF IF dy=0 THEN IF dx>0 THEN angla=0 ELSE angla=180 ENDIF IF dx<>0 AND dy<>0 THEN GOTO 120 GOTO 130 120: angla=SGN(ASN(sinq))*ASN(sinq) !to get angle between 0 & 90 degree only IF SGN(sinq)= 1 AND SGN(cosq)= 1 THEN angla=angla IF SGN(sinq)= 1 AND SGN(cosq)=-1 THEN angla=180-angla IF SGN(sinq)=-1 AND SGN(cosq)=-1 THEN angla=180+angla IF SGN(sinq)=-1 AND SGN(cosq)= 1 THEN angla=360-angla 130:

The IFCo chair On your CD with GDL_CB_3.01, you will find the IFCo chair (the Irvine Furniture Company), one that I have used in recent 2-day training courses. This is more elegant than the ‘Simple Chair’ in the GDL CB and takes considerably more space would allow it to fit in this edition. But you can examine it for ideas. It is a demonstration of the way that GDL is moving, towards a more specific definition of objects, rather than the generic stretchy ones we have been used to. This IFCo chair allows for a custom chair to be designed by the specifier (at high cost no doubt) using stretchiness and parameters. For the more cost conscious, this chair is available in 6 preset sizes, including a choice of arms in two of the styles. If a specific chair is chosen, the custom parameters are locked. A UI tells the specifier more about the chair range.

See the IFCo chair for an example of a User Interface


A Value List can be used to write a Copyright statement with a web address, and the web address should also be written into the Comment Field of the object. Copyright Marmalade and David NicholsonCole ©1998, ©1999, ©2000, ©2001

The GDL Cookbook 3 The SOURCE of all that is good in GDL

Part 2 GDL Voyager

The GDL Cookbook 3 – Voyager

Cookbook 3 Voyager Course T

HIS Voyager section is for GDL enthusiasts who have had enough experience to venture into more difficult territory. The section starts with a series of questions posed to the intrepid voyager, which (if you feel bold) you should set yourself as tasks. Many of the tasks are solved in the subsequent pages. However, for those who just want to work progressively through, look at the exercises and try your luck. There is a lot of GDL syntax dispersed among the exercises. There is a grading sequence in the exercises, but less prescriptive than in the Discovery course. Some of the exercises in the Voyager section are useful as a resource for dipping into when you need to remind yourself of certain routines. I wouldn’t attempt any GDL task without having the GDL Cookbook with me as a reference; for all but the obscurest task, the Cookbook can be used in place of a manual.

Voyager task list

Some useful guidelines



F you attempt some of the following tasks, assume a high level of parametricity in all objects, but try to keep to the point of the exercise, to keep each one within just a few hours. If you are on a GDL course, then you are not on your own during these exercises – the idea is to be thoroughly briefed by a tutor at the start, and to work on it with a tutor close at hand, but not writing it for you. If you are teaching yourself with the Cookbook, try to do these with a fellow enthusiast. Talk over the best approach to each problem. You do not have time to make each one a totally finished product with total error checking, and perfect user friendliness – but do the best you can in the time. Keep focused on the learning requirement of each exercise, and avoid distracting side issues. No matter how experienced you are, make frequent use of the HELP windows and manual.

Deployable ‘Pinero’ scissor space frame: model by DNC ©Copyright Marmalade 1998, 1999, 2000, 2001

HENEVER possible you should apply rules of quality control to all objects. Some of these quality control aspects are: • Even for the smallest model, try to structure the script into subroutines that represent physical components of the model. When you start a model, it is OK to tap in preliminary code, but the moment you are getting it to work, enclose it into subroutines. • Ensure that the subroutines are totally self contained in terms of cursor location. DEL the exact number of cursor moves in each subroutine. • Distinguish between parameters that the ‘user’ will be allowed to change and ones that your script needs to know. Make sure that the user parameters are clearly explained in the dialog box. • Can the parameters be grouped into hierarchical menus? Could you form a series of User Interface pages? • Pay attention to RESOL on all circular elements – efficiency in speed of rendering is a quality issue. • Always work with plenty of paper and pen handy, and be prepared to sketch out every small problem on paper – this is more efficient that tapping things into the script and being annoyed by error messages. • !Document all your !subroutines and !decisions with !comments in the !script. • Put all key words into UPPER CASE (e.g. BLOCK, MUL, DEL etc) and keep all variables in lower case (e.g. len, wid, higt, x1, z0 etc). Do this even for quick and dirty library objects. It’s easer to debug later. • Although it’s tempting to use PROJECT2 3,270,2 for all 2D scripts, try to replace these with 2D scripts if you want efficiency in display in the Project Plan. • Do not be afraid to try new commands and polylines and masks in GDL – some of these may be better than ones you have got set in your ways of using. Use Trial and Error if at first you do not get them working – if that fails, try Logical Thought! 2.1

The GDL Cookbook 3 – Voyager

Table Lamp LIGHT, Revolve, Articulating form, Lamp, Cylind, Ellips AKE a small anglepoise lamp. Avoid excessive detail in the body of the lamp, as the purpose of this is to use the Light command. Include a toggle switch. The Lamp head should swivel. Set two of the lights on a table, and photorender to see how the pools of light work together.


Extruded Section DXF Conversion, CutPlane, Revolve, BPrism PEN a 2D DXF or DWG file from Autocad or similar, convert it to a slab, then convert to a library object and either: • write a 4 directional Mitring routine for the 3D section, or: • write a Curving routine for the 3D section, with parametric curvature. In either case the section should be able to be tilted around X and Y. If you dont have a DXF sectional drawing like this to hand, draw one quickly in ArchiCAD (using floor slab) view the object in plan, and save it as a DWG or a DXF 2D drawing. Reload it, convert it to a SLAB using space bar snap, and view in plan. This time, save it as a library object.


Staircase PUT & GET, BPRISM, REVOLVE, TUBE REATE a routine for generating a staircase with parametric rules for number of steps, risers, tread, material etc. Plan ahead to see how you would organise this, if you wanted: a] Straight stair with handrail b] Theatre seating in the round, c] Spiral Staircase Although these stairs would be used in different parts of a building the routines are similar and if you have time, write both main routines in the same object.


Handrails TUBE, PUT & GET, Circle Geometry, RESOL ESIGN a long handrail for exterior use, such as for a racecourse. One of the problems here is that you cannot use ELBOW and RADIUS, because if you get the RESOL right for the curve, you have an unacceptable number of polygons for the surface. Also, you need to distribute uprights evenly along the circular rail. How would the rail be defined? By chord length and bulge is better than by radius. Ensure (by masking) that the tube looks clean and is not cluttered with lines. Try to make it go up a slope – by defining upper and lower heights (e.g. round a stair).


Geodesic Exercise Can you build using trigonometry? HIS exercise is surprisingly easy if you combine the power of loops and trigonometry, because the icosahedron (20 sided) is so very regular. It has a pentagonal pyramid shape at the top and at the bottom, and ten equal triangles forming the sides. If you use arrays, you can remember the locations, and line all the panels with tubular edges, in fact, hide all the panels altogether, and perhaps put ball joints at all the junctions.


Constant Rectangle 2D Scripting, Global Variables


RAW a Rectangular outline to your project that can be a frame for printing on paper – that stays the same size regardless of the scale of the drawing. i.e. if it is equivalent to A2 in outline when in 1:100 scale, it is still A2 when your drawing is 1:500, and your building is reduced to a speck. The Size of the rectangle is set with A and B, but need not be stretchy. (Hint, you need globals, and it’s 1-line) 2.2

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Catamaran COONS, MUL, GOSUB, CYLIND HIS exercise if a must if you are interested in making meshes, and in structured programming. a) Make the hull of the CAT. First the floats must be made by making half of one float as a COONs and then doubling it to make one float, and then doubling that. The width of the float and the length and width of the Cat should be parametric. b) If you have time and the interest, take the Cat a bit further. Make a central Mast and forestay. The mast should be oval in profile. Make a parametric sail and jib that can be to Port or Starboard tack.


User Interface Mastering the UI command set AKE an object you already know well, and velop a page or a set of pages using the User Interface command set in ArchiCAD 6.5 wards. If it has Value lists in it, see if these be converted to a Pictorial Value list.


d e oncan

Spaceframe / Lattice Cylind, Nested FOR..NEXT Loops spaceframe Lattice beam was part of the Discovery Course. This pays some reinspection, this time in the form of a spaceframe roof. This should be parametric in number of bays, depth and spacing, diameters etc. It involves some FOR... NEXT loops. For the real challenge, you could make its dimensions based on A and B, and the script work out the number of bays. But this is not essential. Ideally, the upper sections should be square, and the diagonals and lower lattice should be round.


Derrick Crane Circle geometry, Cylind, Tube, Elbow LTHOUGH this is a very simplified model of a Derrick crane, it is a good exercise in knowing the XYZ coordinates of objects in circular space and using TUBE to construct it. Making a hook for the crane, and making this lowerable. The crane should be able to swivel round. As the arm of the crane is lowered, the cable should always reach to the pulley at the end of the arm. Try to keep the hook at a constant height.


Hollow Elbow Sweep, Cutplane, Prism_, Loops or cutplane his can be made in two ways – by Defining a hollow tube profile, and drawing it with a Sweep command through a curve, or by Revolve. Make the main radius, the tube radius, the tube resolution, the surface resolution, the sweep angle, and the wall thickness parametric.


Stretchy Battered Wall tool


RCHICAD does not provide a tool for this purpose (how many times do architects use battered walls?), but this tool could serve for ramps and earthberms. Like a Wall, it should have user definable colour on the sides and top Faces, Internal Face, and external Face. You can also do it without GDL, to include windows. Do you know how? It is an even greater challenge to make it mitre or turn corners (anglar or rounded), or to include windows, so do not attempt this unless you manage the main task with ease. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Bowstring Truss – 2D TUBE, ELBOW, Circle Geometry, PUT, GET, For... Next


F you are short of time, do not attempt a 3D Bowstring truss – which has 7 different circle centres and radii! This 2D truss is a development of the Handrail task in the Voyager course – using the TUBE command. A 2D truss only has two circles. It should be parametric in span, height and depth, and in the quantity of lattice members. But you will need circle geometry to work backwards from Span and Height to calculate Center and Radius. The components of the truss can be made with the ELBOW command, or the TUBE command, but for realism and model quality, both the compression member and the tension member are best done with Tube.

Picture Objects and textures Picture, Alpha channels, making materials, global variables


OUR models can acheive added realism if you can put scans of photos of people or plants onto a surface. They are even more effective if you can have the surroundings of the sihouette made transparent by using alpha channels. The same can be done with textures and materials for entire objects. Scan or photograph something and do the Photoshop editing on it to achieve a silhouetted outline. At this point it is useful to learn the routine for making objects ‘Location Aware’ so that flat 2D objects look more solid.

Smooth rounded Bodies! COONS, MUL, Prism, Polylines


ORM part of the front end cabin of a Ford Transit Van. This is done by using COONS meshes. As the van is symmetrical, you only need to make half of it, and MUL to generate the other half. It is not as difficult as it looks. You do not need to make it parametric as the van shape is fixed. Every dimensional location of the front end should relate to the same origin. Also, each COON surface is adjacent to the next, so you have fewer XYZ points to calculate. It is worth maintaining a consistent grid in the Y direction to reduce the workload.

Animation in time Cameras, Global Variables, Articulating Model, TEXT


T is possible to make animated objects change with time. This may not be so useful in practical architecture, but is a demonstration of the powers of ArchiCAD. Try one of these ideas, or one of your own. • 3D clock whose hands turn. • LCD type clock whose numbers change with each frame. • Neon lettering for a club/bar, whose letters light up or rotate in sequence. • Reciprocating single cylinder piston and crankshaft. With each frame of a ‘Path’ it is possible for the library object to read the frame number (N_)and react accordingly. If you position 2 cameras in identical locations with many in between frames, the object will animate. You must have "Rebuild each Frame" set up in the special menu.



AKE Cubes (hexahedron) and Spheres your starting objects. Using Cutplane, form these into truncated polyhedra. Make a cube from a sphere. Then try the rhombicuboctahadron from a cube. Carving, as a way of making these, is considerably easier than building these up. There may be a problem with the way that cut surfaces are displayed, and you have to get Pen colours and materials right. Another thing you may try is a sphere that has every facet in random colours (as shown in the Primer in the Cutplane section). 2.4

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Fun with Helical forms BPRISM, TUBE, Polylines, Trigonometry


IRST make a helical shape with the BPRISM command – experiment with this. Then make a smooth tubular helix using the TUBE command, making the frequency, total and tubular diameters parametric. Finally, try making something like the penguin pool type ramp that is shown in the GDL manual.

Perforated Wall Panel Parametric Holes in a PRISM_, PUT, GET, FOR...Next


RY making a wall panel, perforated with a number of holes. You can make the choice of Round and Square holes parametrically selectable. Given a number of rows and columns of holes, your program should work out appropriate sizes and spacing. Use PUT to organise the array of holes, and use PRISM and GET to produce it in 3D. Can you use the same technique with EXTRUDE, or make a curving object with REVOLVE?

Flexible Tube File Input, TUBE, PUT, GET


UBE command allows one to make tubes which are mitred at all junctions. A sequence of tubing could be made by reading a list of points within the script. These can be in the TUBE command, or can be put into the buffer first using PUT and GET). This is how the spirals are done. You can also try writing a script that can read in a text file, the SAME script could generate a great variety of tubular structures by reading in text files of XYZ points. Thus, complex structures for piping, geodesics etc could be constructed more easily than with conventional GDL.

Kitchen Chair Cone, Structured subroutines, Polylines, BPRISM


HIS elegant traditional chair model can be made almost totally from the CONE command, except for the Seat, Arm and Back made with PRISM and BPRISM commands. You should only need to build half of it, and MUL to make the whole chair.

Stretchy Objects Using A and B


HE user finds it easiest to place objects into the Project plan if they can be stretched. Conventionally made objects will stretch, but all the elements of the models will then be wrongly sized. Make a stretchy object that preserves or recalculates the size of elements. Try one of these: • Soldier, coping or Dental course • Wall radiator (with pipes and valve) • Table (so leg sizes are retained) • Trussed Rafter • Railing with spaced verticals

Report Writing Properties Scripting or File I/O


ET the stretchy radiator (or something similar), to be able to read the global variables, and output a report to file, with a unique filename, defining data such as its location in XYZ, storey, orientation, surface area. Assuming you made it clickable to be double or single panel, make extra clickable choices for the 2D symbol to report on the surface area of the radiator. Instead of the radiator, you could try something structural. For example, a stretchy Universal Beam/Column – has a sectional area, moment of inertia, modulus of elasticity, radius of gyration. The formulae are available in the Metric Handbook. Or just get it to write a report to the Components window, using a Properties Script. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Irregular Surfaces


ERRAIN is one of the more difficult tasks in ArchiCAD - the Slab tool is too flat, the roof tool is another solution, but requires careful tweaking. COONS is only controllable at the edges. MESH combined with RND is a useful way of randomizing terrain – especially when you combine two together, of different colours. MASS is good, but difficult to exploit randomisation. Try it.

Window 3D (Modelled)


AKE a window using slabs within the working environment, then projected in the 3D window and saved as a Window or Door. It can then be edited by opening the library element as a Window or Door. • Now try adding a cill to the window. • Now try making the window head arched. • Now ensure that the window fits into walls of varying thickness and materials. • Allow user to show glass or hide glass.

Smart Structural objects


AKE a stretchy object containing a number of spaced out three D elements or spaced out holes – such as a cellular or castellated beam (with parametrically calculated hole positions). Make this beam react to its length by changing in width and height – with the holes and hole spacing being re-calculated intelligently.

Desktop Clock


HIS can be a totally 2D object, designed to float about on the drawing – either capable of being to scale with the building (whatever the drawing scale) or to be a constant height (whatever the drawing scale). This can display the time to the user, and record accurately the time and date of printing a document. You need to look at REQUEST, Style definition and drawing scale.

More things you might like to try: • • • • • • • • • •

Define Text Styles in 2D symbol, getting 2D symbol to report info. Making Text autosize, whatever the plotting scale. Define Materials or Lights in the script. Revolve, Sweep, Extrude, Pyramid, Tube Slab, CSlab, Croof, CWall, Bwall etc. Make a Macro and CALL it. Time and Date File Input and Output Make a scene entirely using Picture Objects A task requiring Circle Geometry

• Try a 3D truss – using tube or trig. • Try a tree trunk, with random generation of the next set of branches (Difficult) • Try making a simple assembly of shapes, (as used for example in the demo of materials in ArchiCAD) and then create materials (in either script or in working environment) which exploit alpha channels, for transparency, bump mapping etc. • Some clever railings that can be level or follow up a stair, and be stretchy • Something that changes position or state as each animation frame progresses. • Something (such as curved glazing) that uses arrays, either in the script, or even as part of the user input in a parameter box. 2.6

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Door – 2D Scripted Arc2, Line2, Globals


AKE a simple opening door in 3D. Use 2D scripting to generate the 2D door image, and use global variables to make sure it is always the right width to fit the thickness of the wall it is put into. Make it show different levels of detail between 1/50 scale, or 1/100 scale. AKE a copy of the same door, but do the 2D using 2D symbol and make sure that it responds to scale in the same way, using the Fragment2 command.


Ridge and Hip tiles Stretchy objects, Tube or extrude


AKE a roof similar to the one here, and make a univer sal stretchy hip and ridge tile that can follow all the hips and ridges. Make it so that it stretches horizontally in plan, according to the dimension A. Make it so that the pitch is defined as an angle. AKE a copy of the hip-ridge tile, and redefine it so that you use the dimension B to define the upper height of the tile (so that it is no longer based on angle).


User Defined Lines ‘Squiffle’


RAW 2D lines in the Project Plan. Select the lines drawn and copy them to clipboard. From the Options menu, select ‘Line Types’ and make a new Symbol line. Try making a ‘squiffle’ line, and then use that to turn a 3D axonometric into something that looks hand-drawn. Use the same technique to make insulation, or concrete texture, or lines including text or images.

Library Object conversion PUT and GET, Sweep or RULED


RAW out a slab in the Project Plan, and save it as a Library object. Look at the script: you will see a cPRISM. Modify it so that you have a PUT statement of the X,Y locations of the points. Now write an EXTRUDE statement that uses GET, to feed the locations into the extrusion. Use NSP to determine how many points to put in the extrude. OW, try it again this time to make a more complex shape. Spacebar snap a polygon to the slab, and then shrink the polygon (so that it has the same number of vertices as the first slab) Move the polygon aside slightly. Spacebar snap another slab to the new polygon. Now save the two slabs as library objects. Now use PUT and GET in the same way (stealing the X,Y locations so conveniently given to you) and make a RULED command. By the way, note that this could also be done with a SWEEP command, using only the first set of points used for the Extrude exercise above.


Redefining Magic parameters A, B and zzyzx are what I call Magic parameters because they control stretchiness and appear in the info box for the object. The way to change them is in the info box, in the settings box, or to stretch the objects. If you need to change them any other way, you can do it by renaming them. For example if a piece of furniture is vertically stretchy but must not exceed a range of 1.0 to 2.0 metres, you can write in the Master or 3D script:

hit=zzyzx !height IF hit<1.0 THEN hit=1.0 IF hit>2.0 THEN hit=2.0

Use hit to make the object’s height. Then the user can stretch it all they like, but the object will stay within those limits. If you want the stretchy buttons to stay in range (or bounce back!) you can write like this: (first, in the Master script) hit=zzyzx IF zzyzx<1.0 THEN zzyzx=1.0

(then, in the Parameter Script) IF hit<1.0 THEN PARAMETERS zzyzx=1.0

©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Tips and Tricks Squiffle


OMPUTER line drawings look too perfect and determinate and often mislead the client into thinking that your sketch design drawings are looking like a finished scheme. School of Architecture tutors are especially prone to be hostile at crits when faced with hard exact line drawings when the other students are still in the soft pencil stage. Try using ‘squiffle’. Create a Line Type by drawing some feathery or wiggly lines in 2D, Copy them to clipboard. Go to Options:Linetypes, make a new one and call it Squiffle (or somethig similar). Paste in the wiggly line. Modify the scale options if it’s too big or small.

Now view your model in 3D. Save the model as a 3D Pict, with VECTORED lines and polygons. Then bring back the 3D view into the Project plan with a ‘Merge’ command. Now select all of the 3D view you have brought in. Double click on the line tool in the toolbox. Now select ‘squiffle’ for the line type. Lo, your 3D drawing is converted into something that looks informal, even hand drawn to the casual viewer. this can be printed direct, or popped into Plotmaker.

Draw your own line in the Project Plan window, using the 2D line tool.

Above: Ask for a ‘New’ line, and click on ‘Symbol’. That will allow you to paste in some lines. Below: The line can be solid or dashed: move the little flag markers. The normal Paste command doesn’t work, you have to hit the Paste Line Components button.

Right: You will have to play with ‘Scale’ to give the line the ‘squiffliness’ that you wish for. Left: Your 3D drawing now looks more informal. See a later exercise on ‘Squiffle 2’

Picture Objects


EOPLE often have trouble getting PICTURE to work – see the exercise in Discovery, called Lioness. To remind you... The image to be rendered has to be saved from Photoshop into a currently loaded library. It must be TIFF or PICT for Macs and TIFF for PCs. Some PC users recommend ticking the ‘Mac tiff file format’ button in Photoshop. In the parameter box, with Macs, you must call the file by its real name, e.g, tree01.tiff, whereas with PC, you have to omit the suffix (and let Windows add it on for you), and write just tree01. This is a real pain, as archives which are ported from Mac to PC or back usually transfer parameters directly, and could result in images not rendering on the alternative platform. Even if you use channels (for alpha channel transparency) make sure you 2.8

This street scene is easier to model by photographing the buildings and making them into picture objects. Only the building on the right is 3D modelled.

‘flatten the layers’. After a modest amount of copying and pasting, a photoshop file may have generated half a dozen or more layers – which prevent the file being saved as tiff or pict. Picture objects lie flat on the floor, so if you want it to stand up like a tree, you need to ROTx 90 before you issue the command : such as ROTx 90 PICTURE “tree01” 8.0,12.0,1 DEL 1 When you write an archive for transfer PC to Mac or back, the Pictures used in the Picture objects do not get included – you must copy them over separately.

Picture objects should be 2D scripted to make them stretchy – it’s more user friendly. If you use tiffs on Macs (for portability to PCs) note that tiff alpha channels DO NOT WORK on AC 5.0, but they do work on 5.1 & 6.x. For facades, record the number of pixels horizontally & vertically, and ensure that the proportions of the PICTURE rectangle are perfectly matching. 60-80 dots per metre of building is an ideal lowest density. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Tips and Tricks Use the GDL Manual!

The Digital Architect


by John Stebbins, Digital Vision, Irvine CA OME people think that ArchiCAD needs to do everything well. I have never believed this. It does MOST things well and as far as project THROUGHPUT is concerned, it can't be beaten for most things. I believe there is no other product out there as efficient as Archicad for most of what architects do, but occasionally, we have to create spaces, objects and wierd things with lots of curves. But, I have always maintained that the DIGITAL ARCHITECT needs a "tabouret of tools" – a chest of tools – to get the job done. Can you build a building with just a hammer? The supplemental tools the ArchiCAD Digital Architect needs to master and to invest in, in my humble opinion are, in order of importance: • Photoshop – for image manipulation and photomontage • FormZ – for modelling wierd things • PowerPoint – for slide show, speaker support presentations • Macromedia Director – for multimedia, interactive presentations Of course there are other tools, but as an instructor of digital architecture (UC Irvine Extension), I see these as the most important. Everyone needs to ask themselves: how digital do I want to be? The more digital you want to be, the more of the above tools you will need to master (or have a master as part of your team). I also believe that the more digital you are, the more ‘of service’ you can be to your clients, the more additional services you have to sell, the more efficient you can be, and if digital tools are properly deployed, the better architecture you can create. How digital do you want to be? John Stebbins

ANY ArchiCAD GDL commands are covered in various sections in the GDL Cookbook. But please note that it is not the function of the Cookbook to replace the manual. You need to use both. You will find the GDL Manual a lot easier to read now you have tried the Cookbook. The AC6.6 GDL reference manual is better than its predecessors. The main ArchiCAD reference manual chapter on Libraries is an essential read for anybody starting GDL, as it contains fundamental information of library object writing and library organisation (some of which I believe ought to be in the GDL manual.)



HEN rendering textures you may be wanting to use Alpha channels – to get transparency. These have to be made in Photoshop (or similar). Save as PICT or TIFF on Mac, and TIFF on PC’s. If you want to make your files truly cross platform (through saving as archive files) use only TIFFs. These files should be saved in uncompressed form. If you apply compression such as JPEG, one of the first things to be squeezed out during compression is the alpha channel. If you are not using alpha channels, you can use an amount of compression, save as JPEG, which will work well on PC or Mac.

Rendering – Speed


F the project is large, photorendering often appears faster than 3D drawing, analytic or raster. Before embarking on a VR walkabout or a flythrough animation or series of pictures, ArchiCAD tries to draw a 3D of the most recent camera used – which can take ages. It does this for good reasons – it has the effect of an integrity check on the whole model to make sure that there are no objects, pictures or textures missing. Therefore, set up one 3D camera facing away from the model in Raster mode (so that it draws nothing), and immediately after, proceed with the VR or Flythrough. It will start with the rendering almost immediately.

Preview images


FormZ (John Stebbins continues...) I have been a dealer for FormZ since 1991(and an ArchiCAD dealer since 1989) and find it is a perfect complement to ArchiCAD for modelling organic, spline-based shapes, like certain furniture, light fixtures, hyperbolic paraboloids, etc. The way you bring these things into ArchiCAD is to use the ‘Open Library Part’ command, choose ‘New Object’ and bring the FormZ model in as an ArchiCAD object via DXF or 3DStudio Metafile, saving it in your loaded library.


T improves the presentation of your Library objects if you can give them a Preview window. If you look in the object browser (in the Library part settings box) you can see how drab are the objects without an icon. Preview image gives them an icon. Render an image of your object in 130x130 resolution, select it and copy to clipboard, open project preview window and paste image; save. Now try and see if you have a preview. This is especially good if you are making objects for other users. ©Copyright Marmalade 1998, 1999, 2000, 2001

Roof Cutting


N AC5 you have a choice of cutting roof edges vertical, or perpendicular to the surface. With AC6, you can do more. Just Alt-click on a roof, and then hold the mouse button down on a roof edge until the menu pops up. You now get an option that looks like an XACTO knife blade – with which you can customise the cutting angle of the edge. 2.9

The GDL Cookbook 3 – Voyager

Fit a Rendering into a Photograph wrote: How do you guys fit a rendering into a photograph? From: Here is a very quick answer: 1: Use a photo in the background of your 3D view to match the model to the background. [Be sure that pixel resolutions match] 2: Render your image with the model against a white background. Do not use the photo background in ArchiCAD's render!! Make the sun slightly yellow-brown and the ambient light slightly blue-mauve.

3: Merge the two images [background and rendered model with white knocked out] in Photoshop. 4: Use eraser to meld edges of model at ground level to photo background. [Judicious rubber stamping of plant material will also disguise the edge. 5: Fake up a cast shadow to integrate the two images. 6: Adjust color balance of background and model to match. [Color photos tend to be warmer than ArchiCAD models.] 7: Add diffuse glow and some noise to make the model graininess match the film grain of the background. 8: Jerk around with it for hours massaging every detail. Now it looks almost half done. • Dwight ‘wait for the book’ Atkinson, MAIBC

Recording contract drawings, long term

Pens changing when opening DWG files

Duane Valencia writes: have been RECORDING the sets that go out by writing PLOT files instead of duplicate layouts. I find this a bit safer and more efficient. Safer in that 3 years from now, I don’t have to worry about backwards compatibility with plotmaker. I don’t even need plotmaker to do the plotting. Theo de Klerk writes: ECOND that! We keep a copy of the PLT file in a folder with the date with the project folder as an electronic record of what drawings were issued. If someone asks for extra copies of a particular drawing just duplicate the PLT files and drop them all in the spool folder – very quick! Editor’s Note: Another question is, which media is safest for long term storage. At the time of writing, it seems CD is guaranteed the longest life into the future. Ferromagnetic media (zip/tape/disk) have a limited life, as do the mechanisms. DVD is still undergoing development of standards.



True Line weights in 2D


OU can set up the Pen palette to give you different colours, and you can set up the line weight too, in millimetres or points. But they persistently remain as hairlines, no matter how much you zoom in. The answer to this perplexing problem is to look at the Options/Display Options.. menu where, if you set ‘True line weights’, they suddenly work. You need to be pretty settled on the scale that you will be printing at; now that you have set absolute thicknesses, the relative line weights will change if you change the drawing scale.

Stationery File – keep your settings


OU want to preserve all your hard won material, layer and line settings for the next project? On the Mac, you can save a ‘Stationery file’. Take a COPY of a file that has all the ideal settings, linetypes, layers and materials. Clear all stories, clear all objects – so that the file is empty. Save it as ‘AC_template’, or some such name. Back in the Finder, Get_Info on the file, and tick the ‘Stationery’ checkbox, and Lock it. When this file is next opened, it will offer you a new untitled window, retain all your preferred settings, but not altering your original template. If your project has already started, you can use the ‘Merge’ command to bring in another template file that already has the Pen settings etc that you want. 2.10

From: Matthew J. Pastula <> recently opened a dwg file from AutoCAD 14 on the PC side and it changed all the standard pens and colors all around. Is there any way to get the previous pens and colors back without reloading ArchiCAD? Duane Valencia writes: THERE are a couple of ways to achieve this... 1. If you have an old file that has the pens you want... Just open it. Then start a new drawing. This new drawing will maintain the pens from the previous drawing and then become part of the new file. 2. If you like the factory presets... hold the option(alt) key down and choose NEW & RESET from the file menu. This will bring all defaults back to factory. If you are asking how you get this AUTOCAD file to use your old pen setup... then just copy all the elements from the .dwg file and paste into one of the scenarios above. The pens will remain as they were defined for the blank file. CAUTION: this means the pen weights will also be "preset" and may make your dwg elements different from that intended.


Transferring favourite settings Having started a new file, you realise you want the settings from an older file, perhaps one that you started with an older version of ArchiCAD. In particular, pens change between versions, and people are known to modify the pen palette of thicknesses and colours. You can transfer preferred colour and line thickness setup to the new file in the following way: 1) Open an old file that has your preferences. 2) From there, open a new (blank) document. This will then have your palette preferences. 3) Merge the file with the ‘wrong’ colour palette into this open blank file. It will now have your preferences. 4) save this as [filename] of ‘wrong colour’ file to overwrite it.

Printing in EPS You might want to prepare a drawing for publication with Quark Xpress or Pagemaker. You do not have a ‘Save as Postscript’ option when saving from the 3D window – but you can save a drawing as a Plotmaker file. Open a new Plotmaker layout and bring the .PMK file in. Now you can ‘Save As...’ to Postscript. If your pen thicknesses are all too thick, go back to Plotmaker, adjust pen thicknesses for that image and save again. You can adjust each colour used in the image. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Tips and Tricks

Compression Advice

Making scripted objects stretchy or squeezy

HEN you save an Flythrough or VR file using Quicktime, you will be offered the chance to set options for compression. Quicktime is not only about digital video, it also contains ‘CODECs’ which are algorithms for COmpression and DECompression. The listed types in AC6.0 are: Animation, BMP, Cinepak, Component Video, DV-NTSC, DV-PAL, Graphics, H.263, Intel Indeo Video 4.4, Motion JPeg A, Motion JPeg B, PhotoJPeg, Planar RGB, Sorenson Video, and Video. The most commonly used are Animation, Cinepak and JPEGs. ‘Cinepak’ achieves astonishing compression, but has a serious loss of quality, and can take too long for the movie to decompress as it is read in from disk. I use ‘Animation’ most often. You also have a slider bar from Worst quality to Maximum quality. If you haven’t got a problem with disk space (for example you are saving to Jaz cartridge or to CD), my advice is to set the slider to Maximum quality, or to No compression at all. There is a balance to be achieved – with no compression, the disk (or CD) can be too slow to deliver the frames – if there is some compression, the disk can deliver faster, but then you need a fast processor to decompress each frame. A smaller frame size (320x240) and a slower frame rate (16fps instead of 24fps) will also help the speed.


HIS topic is addressed in several of the Cookbook exer cises, but in a nutshell, here are some guidelines. • Make the width and depth of the object dependent on ‘A’ and ‘B’ in the 3D script. • Your 2D script, which will either be scripted or based on a PROJECT2 must include HOTSPOT2’s based on A and B. For example, in one rectangular object:

For another example, in a concentric rectangular object:


HOTSPOT2 -A/2,-B/2 HOTSPOT2 A/2,-B/2 HOTSPOT2 A/2, B/2 HOTSPOT2 -A/2, B/2 RECT2 -A/2,-B/2,A/2,B/2

As long as there are Hotspots whose distance apart is equal to A and B, this routine will work. For items which are linear, you can use HOTSPOT2 0,0 and HOTSPOT2 A,0. Because these Hotspots are dangerous (move them and your object will be distorted) you will always have to use Cmd-D to move them. It is better to plant additional hotspots at places where it is safe to pick the object up. If stretchiness is a big feature, plant a 2D crosshair at the A,B points (LINE2 A-0.02,0,A+0.02,0:LINE2 A,B-0.02,A,B+0.02)


Servers with Teamwork – try iMac!


Wirelines in Rendering

HERE has been discussion about getting Teamwork functions to work swiftly with a file server during Send and Receive. The key isn’t just the speed of transmission, but how fast ArchiCAD takes to process the changes. There is as little as 10% difference between 10base-T (normal ethernet) and 100-base-T even though 100-base-T sends files 10 times faster. Ultra fast SCSI or IDE give the biggest speed increases over computers with normal disks, even if equipped with fast processors. One cost saving solution that surprised many: John Zdralek writes: “Are you running ACTW on a Mac network and are *NOT* currently using a G3 for a server? Here’s a tip. Buy an iMac. The best $1,199 you will ever spend. I was using a PM7200/120 as a server on a 100bT Ethernet Network. Opening an 8.2mb ACTW file with a 200mb library on a G3/300 client took 5 minutes, 48 seconds. Two weeks ago I bought and setup the iMac as the office server, (running plain old appletalk, NOT appleshare). Are you ready? Same file and library, opening on the same G3/300 client: 1 min 47 seconds! OK, so you think, "but we need a REAL workhorse for our server. The imac is only 233mz and has an IDE drive." Check out this test – I ALSO setup a G3/300 minitower WITH Ultra Wide SCSI drive as the server, and opened the SAME file on the G3/300 client desktop. The elapsed time to open: 1 min 40 seconds!!! I am VERY glad I saved $1,100.00, (PLUS the cost of a monitor) by buying the iMac.”

Tracing Scans


UCH could be written on this. I believe that you are better tracing into ArchiCAD yourself, so you selectively draw what is significant information. For mechanised tracing, CorelDraw (with CorelTrace) is highly recommended, if set to ‘centreline trace’. Bitmap scans cause an unpleasant slow down in AC, and should be deleted as soon as possible after tracing, or moved to an invisible layer, or storey. If the map you are scanning from has a grid (e.g. UK Ordnance Survey maps have a 100metre grid), set the ArchiCAD grid to the same grid. Rotate the scan until it is level with the grid. Then you can stretch the scan. To keep the scan in ©Copyright Marmalade 1998, 1999, 2000, 2001

Aaron Sills<> OMEONE mentioned wanting to produce wireframe within a rendered view. Save a hiddenline view as 2D elements (2DL) and then render the exact same view and save that as a tiff or pict. Lay the lines directly over the top of the rendering in Plotmaker. This gives a rendering that is a bit more graphic (for want of a better word) because of the outlines. The 2DL can be edited before putting it into Plotmaker to remove any lines that aren’t needed in the final image (all those extra lines on 3D people for example).


proportion, tweak the top right corner away, then return it to the previous location, hit Alt-A (which locks the diagonal angle of the scan, and then you can stretch or shrink it, knowing that the scan retains the correct proportions. You might have to do this several times. If you can get a site plan that is already vectorised – e.g. a UK Ordnance Survey map in .dwg format, you can use the ‘Find and Select by pen colour number’ to reduce the multitude of layers to just a few, such as building outlines, building names, kerbs, levels etc. When all colours are copied over, delete all the original layers. 2.11

The GDL Cookbook 3 – Voyager

Tips and Tricks

Animation / Flythroughs

Bounding Boxes in 2D



HERE are occasions when even DNC uses the conventional method of making Library objects using walls and slabs. I often make composite objects using GDL objects previously made. (By this method, you get the correct syntax with the CALL command.) ArchiCAD puts Hotspots at the ‘bounding box’ of the object – which can be a nuisance if the object is very complex or curvy, as it may not relate to the real object’s position. It also fills the Project plan with undesired Hotspots which show up when you marquee another object. You also get one at the centre point of the bounding box. If the 2D view of the object is just a 2D Symbol, you should put one hotspot at the origin of the symbol window, then put hotspots on the real points that you want hotspotted. Turn off ‘bounding box’ hotspots in the Library object checkbox, and save. In AC65 hit the ‘Details’ button to find this checkbox. The bounding box will go. If you write Hotspot2 commands in the 2D script in AC65, bounding boxes disappear. In AC6, 2D symbols have fallen into disuse. Autoscripted objects generate many scripted Hotspots, so you can more readily turn off the bounding box if there is one.

Object on left is what ArchiCAD gives you. But you can change it to the one on the right.

Batch Rendering Stills


OU can make several camera layers in the camera settings box. Make one layer called ‘overnight images’. Set up in this layer a no. of camera positions in views that you need. Make sure that ‘Photorendering settings’ are all correct. Before you go home or to bed, start up a Flythrough, set to render Keyframes only. Turn off the screen and have a good night’s sleep. Next morning, you have a disk full of images that you would never have had the patience to wait for in the daytime. 2.12

lythroughs (or drivebys or what ever) can be good but can also become boring. It take hours or days of computer processing to produce just a minute or two of the ‘witches broomstick’ flying effect. But just think... the TV and film industry has accustomed us to pans and zooms, cuts to another scene, or from face to face. You could do better to stitch together a series of shorter clips. Some collected Tips and Tricks on effective animation: • Use Storyboards and plan your final animation before touching the camera tool. Most viewers get bored quickly, so think of some variety. • Use recognisable items (for example a fountain) in views so that the viewer does not get disorientated. • Look at varying the speed at which you ‘fly’ (vary the distance between cameras.) • Compile the animation first with only 3 or 5 ‘tweens’ per keyframe to make sure you like the route. • Dropping the camera and zooming into a building is much more effective than the orbiting or landing by helicopter effect. • Zooming could mean having a series of cameras getting closer to the object (with the target fixed on the object). But if you place two cameras in identical location and target, you can have one set on a zoom angle of 90 degrees, and the other on 30 degrees. With 20 frames in between, you have an effective zoom. Because the perspective doesn’t change, it seems smoother. • Avoid making the target switch about crazily – as you zoom towards something or orbit around it, make all the cameras share the same target location. • At least one level if not more of AntiAliasing is essential, otherwise thin objects flash on and off erratically. • Overall don’t try and create the animation in one go. Use some video editing software and include stills and photographs to get your point across. • Adobe Premiere is good but there is shareware quicktime editing software on the web if you look. MoviePlayer 2.51 for the Mac allows no-cost movie editing. MoviePlayer 4

is available from Apple as a low cost part of Quicktime pro. • Blending or ‘morphing’ one still image to another still image using Premiere or Director will give you several seconds of animation with negligible toil. • You could use something like Director for final assembly. • VR walkabouts can be more interesting than a flythrough because they are interactive – take less space on disk – are easier to download from web pages – can be combined with real photographic environments. • It is becoming more commonplace to view animations on CD on a computer than on VHS. So don’t worry so much about getting it onto tape. • Save animations multi-platform & write CD’s in hybrid format so that Macs and PCs can share the fun. • An ideal size is 320x240 pixels: fits the aspect ratio of a computer screen perfectly. If you use resolution bigger than that, then it is going to take longer to render and it will display more slowly off the CD. • Save the animation sequence in ‘PICS’ files on the Mac, and ‘Sequence targa’ files on the PC; this way, they are “in the bank” even if the machine crashes later. ‘PlayBack’ is good at joining PICS files together. • Avoid over compression – gives you fast delivery, but poor image quality. • Avoid zero compression – best image quality, but if your flythrough is coming from a CD, it will be leaving out many frames in its effort to keep up. • If you use Sound, try it several times, including from CD. Set Sound to be the device which determines speed of display. Broken or missing images are not as bad as broken or missing sound. • Make your objects Location Aware so that they are ‘simple’ when distant from the camera – and Rebuild Each Frame. The time of rebuilding is saved by the vast reduction in polygons and light fittings. • The ArchiCAD background remains static, which makes your movie a bit silly – loses its sense of motion. Use a clear sky, or try a cyclorama (see in the Cookbook).

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Tips and Tricks Vertically Stretchy Objects – zzyzx


NE innovation of ArchiCAD 6.x is to permit GDL users to provide a quick way to enter heights of objects without having to open the settings box. With AC5 and with window/door making, you can use B for the height, so you can make the object vertically stretchy. ‘zzyzx’ is the new way of entering heights, if you use them as the height parameter, ArchiCAD will give special treatment to it. Amusingly, the GS team spelt it as ZZXYZ in the final english language manual, but I gather it didn’t cause much amusement in Budapest after thousands had been printed. I quote some recent correspondence on the Internet which brought me a special email from Budapest – read on.

David N-C wrote toLaszlo Vertesi of Graphisoft-HU, Ha Ha!! Do I guess that some of your programming team used to play the famous game ‘Collossal Cave’?? Wasn’t that was the password to get from the Sapphire room back to the House in the Forest??? (and back down again) Laszlo Sparing of Graphisoft-HU replied, Dear David, I was the fool who suggested this stupid name for this standard parameter. I looked for a unique name which doesn’t make any old library part obsolete. Names like Z, ZZ, ZVALUE, ZPARAM etc. can be used anywhere in the ArchiCAD world, but I hope, this name is strange enough, difficult to remember, and that’s why ideal for the above goal. What is ZZYZX? – The enclosed picture shows you the solution: a guide-post in California, close to the Mojave desert. If you drive from Los Angeles to Las Vegas, you can find it. I’ve never been in this village(?), but its name was so strange, I made a short video about it. The picture was digitized from this film. So, no computer game, only a short visit to the city of Casinos after a conference. >Best Regards, Laszlo Sparing, CTO, Graphisoft R&D

To which I replied, firstly to the effect that I was gathering that almost everybody who works for Graphisoft seems to be christened Laszlo, but secondly, I have actually driven a car through the Mojave desert from LA to LV, and although I didnt see that sign, I noted that there is a lot of wierdness out there – and it doesn’t surprise me if there’s someone trying to make their town the last in the alphabet. You see ZZYZX from 35000 feet if you fly from London Heathrow to LAX on a clear day.

Postscript ZZYZX is good and bad.... Good in that it’s quick to enter new heights; objects viewed in the 3D window get high level hotspots and are vertically stretchy. Bad, in that they are not stretchy in the section view, and the height displayed in the info box is an absolute not a relative height, so if you enter a new altitude for the object which is higher than the zzyzx factor, the object finishes up inverted! If you spell it wrong, your objects will not be stretchy and the reason why may elude you.

Protecting your Scripts


F you wish to protect your scripts, you may try saving your Library objects as Binary..... bad idea!! they lose all parametric qualities. There is no easy fix for this within the legal syntax of GDL. However, if you talk nicely to the Graphisoft distributor in the country of your residence, and make out a case that you are writing objects and wish to protect your code, they do have a little application that is only about 25k, that they can send you. Run it, and select the object you wish to protect, and it will do it. The object is fully parametric, but if someone tries to read your scripts, they are politely told that the scripts are unavailable. However, there is no unprotect or undo command, and you must be sure to do it to a copy!! My recent information is that this has not been extended to AC 6.x so will only hide the 3D and 2D scripts. The policy of Graphisoft and the GDLA is to encourage open coding of GDL, so maybe you should not worry too much about hiding your GDL code. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Tips and Tricks Rendering – textures


OST of the material definitions in ArchiCAD are in surfaces of a non specific nature with attributes like colour, transparency and reflectivity applied, but no texture – for Example ‘Whitewash’ and ‘Stainless Steel’. A number of them also include textures – for example ‘Grass’ and ‘Pine Shiny’. In renders, these untextured surfaces are prone to look posterised with areas of slightly wierd shading – disturbingly visible in VR panoramas.

My tip here is to apply textures to most of the surfaces you use, even when the texture you apply is largely a little square of nothing (just white). With Photoshop, you can introduce the tiniest bit of ‘Noise’ to make sure that there is something in the little white square. The bit map can be a tiny tile as there is zero grain in the tile. You can still set attribute like shininess, transparency. But the main point is that you seem to get better play of light over the surface.

Alpha Channels – Another tip is to have a hard look at these. If you have a wall panel perforated with holes, that would be a very complicated GDL task to model the holes, and would add to the rendering load (all those polygons!!) By using a texture that is just a Bitmap with an alpha channelled hole in it, and making that into a material, you can apply the material to solids and they look completely perforated. It’s great for trees, hedges and shrubberies!Use it for wire netting, wired glazing, venetian blinds.

DWG Export advice

Memory Management writes: HEN opening an ArchiCAD generated building cross section in AutoCad R14, the windows came in as blocks which could not be exploded for editing. Duane Valencia <> writes: N light of our conversation of PURGING LAYERS, I recommend the following sequence BEFORE sending out DWG’s....


W I 1. 2. 3. 4. 5. 6. 7.

Create Layer Set for dwg export. Change to HAIRLINES and no wall fills (unless they are needed). Export to .dwg. Import back into ArchiCAD w/ EXPLODE BLOCKS INTO ELEMENTS selected. PURGE unused layers by the method previously discussed. RE-export to dwg over the previous file. ZIP the file for emailing.

DNC adds: If you export to DWG/DXF, you may be surprised to find that you have only exported 2D data. The trick is to be have a 3D window open. The export function will then allow you to save as 3D. In fact the same applies to any 3D export: 3ds, Artlantis, Strata etc. In the case of Artlantis, you have to have a perspective 3D in view.

Mike O’Brien adds: I have found that an apparently empty screen is often due to AutoCAD having placed objects ‘out in space’ thousands of feet beyond the building. So, everything is so tiny on the screen as to be invisible. To check for this, do a "select all" and see if there are objects (so small as to be invisible) selected on your screen. Zoom in on them and you are sometimes amazed to see a floor plan. Then, delete the distant object that is way off to one side and is ruining everything for you.

HESE days RAM is so cheap, there is no point trying to struggle along with 24 or 32 megs. ‘Slam in the Ram’, I say! However, if you are still struggling – for example doing a long VR render and anxious to avoid having to run out of RAM on the last panorama – two small tips can be used. Options/Preferences/ Data Safety gives you the chance to reduce the number of Undo steps, which normally force AC to allocate quite a lot of RAM for the purpose. Turn off virus checkers and your desktop picture if RAM is critically short. Forget lights and shadows – you have no hope without enough RAM. Ensure that your model does not have excessive polygons, textures or picture objects. Macs can use Virtual RAM, and with MacOS 8.x, this can be used efficiently. The ideal arrangement is 50% more than your real RAM. For a 64 meg machine, increase it to 96meg with VMemory. Ignore the ArchiCAD warning against using VM, it is officially obsolete with OS8+. Picture objects seems to cause memory problems. A long overnight render (for a VR) may stop in the middle of the night due to insufficient memory, even though each panorama has been safely saved to disk.

DWG 2D Import – Layers


F you do this you find that you in herit all the AutoCAD layers which need to be changed or at least you have to create all new layers for your drawing – not to mention all the default settings for everything has to be reset. This is very time consuming. Any ideas? Open that AutoCAD I/O config file (using a text editor) and go to the Layer Convert section. Follow the directions to ‘automatically convert layers’. Also, if your imported file has a bunch of layers with nothing on them do the following... 2.14

• Open dwg file into ArchiCAD • Select all (make sure no layers are locked first) • Copy • CLEAR all layers (in layer dialog box) • PASTE back all the elements; only the needed layers remain. If you want the whole DWG file in a simpler layer arrangement of your own making, make a layer for the 2D-dwg, a Layer for the Text-dwg. Now click in the 2D lines button in the tools palette and

Select-All. All lines will respond and you can move them to the 2D-dwg. Do the same for round/wavy 2D lines. Now click in the text button, select-all and move to the text layer. Now hide those two layers. If anything remains visible, move it to a layer of your choice. When this is done, go to Layer settings and Clear all the imported AutoCAD layers except your two new ones.

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

DXF Import 3D by Djordje Grujic, ArchiCAD-Talk OK, StepByStep: URN the computer on, make coffee/tea/soft/hard drink, assume the most comfortable position. Soft music and subdued lighting not necessary ;) • Ensure that your modelling application has exported a 3D DXF (although if it’s a DWG, these instructions still apply). • Start your ArchiCAD, click on the pulldown Filemenu. • Click on Open Library Part, or use Ctrl+Shift+O keyboard shortcut • In the dialog box that appears, go to the appropriate folder, choose DXF (or DWG) as the file format, and keep ‘Object’ in the ‘OpenAs’ field; if you open this as a door, or window, it will not work • Click on Open: A Dialog box appears, asking you for the real world unit your DXF unit represents; this is a very common place for errors, making your DXFs too big or too small. My preference is to open the object as a 3D Script, because I like to meddle and change pieces of it so that I can put in some material parameters, but Binary will be faster; if you have a conversion file, use it!

• Click on OK and peruse your favourite drink if the DXF is big. • ArchiCAD Object dialogs will appear; Click on File in the pulldown menu, and choose Save As; give a name, and save it in a folder with an appropriate name, preferably MyTrees, or DXFs or something like that; and make sure the folder is one of the loaded library folders. Skip requests to load font files. • If you want to check the 3D looks of your DXF, click on the 3D View button (lower left of the main object dialog box). If there is any 3D elements, your 3D Script window should be full of text, and there should be something in the object’s 3D window, preferably exactly what you want. • The same way as you clicked on the 3D View button, click on the 2D Symbol button, so that you can see what you will have in the plan. Add Hotspots if you want to. • Close the library part window. Click on the Objects in the Toolbox. Your just-created object should be the default one. • Place it on the plan. Activate the 3D window to see it. • Finish your drink, you deserved it!

DNC adds: If you bring 3D DXF’s directly into ArchiCAD, you get the 2D view only, which probably happened to the person to whom Djordje was answering in such detail. If you bring it in editable, you may be surprised by how big it is, and you will find the result virtually uneditable; it could

contain thousands of lines. The DXF will have been converted into the more obscure GDL commands like VERT, EDGE and PGON, or loads of PLANEs. DXF’s are big Text Files and DWG are Binary, but Macs can read them from PC disks without any pain.


Memory Settings GDL per se requires very little memory, but Rendering, especially with shadows or with VR panoramas requires a lot of memory. F you start making beautiful tubular structures now that you have learnt GDL, you will notice that rendering and shadow representations are slowed, even when you have tried hard to reduce excessive detail and smooth curvature. At some point, ArchiCAD may even pack up with insufficient memory to complete the rendering.


Quitting other applications releases more memory! On Macs, it is easy.


AKE sure first that you have enough memory. Then ‘Get Info...’ on the ArchiCAD application Icon, and enter a Minimum and a Preferred size for ArchiCAD. Always leave at least 16megs free for System. Activities like Printing, File sharing and Quick draw 3D rendering take place in the System memory, OUTSIDE of the memory used by ArchiCAD. Leave enough!

©Copyright Marmalade 1998, 1999, 2000, 2001

On PCs, it is more complex – beware! 1. QUIT all applications, use the Run... command from the Windows Start Menu, type in ‘Regedit’, and click ‘OK’. 2. Double-Click ‘HKEY_CURRENT_USER’. Double-click ‘Software’. Double-click ‘Graphisoft’. Double-click ‘ArchiCAD’. 3. Double-click ‘Fixed Partition’ and change value from 0 to 1. Quit Regedit. 4. Run ArchiCAD briefly, then close it again. 5. Repeat operation 1. and 2. again. 6. Now you see something called ‘Partition Size’. Double-click. Change it to Decimal with the button, then enter an amount of RAM to allocate to ArchiCAD. Try not to exceed 112megs. 7. Quit Regedit, and run ArchiCAD. If it doesn’t run, you may have given it too much memory; repeat the whole operation with a smaller number. Windows needs at least 16megs. 8. If it’s gone very wrong, you may have to re-instal ArchiCAD! 2.15

The GDL Cookbook 3 – Voyager

Tips and Tricks Writing with Acrobat

Syntax errors with CALL & PICTURE



lthough some applications will ‘export to pdf’, the best printing quality comes with the official Acrobat authoring tool. Instead of printing to PDFWriter, print in the direction of your normal laserprinter, using Acrobat Distiller as your PPD file, then select ‘Save Print File’ instead of actually printing. Drag the resulting .PS file onto the icon of Acrobat Distiller, then select the print quality you need (‘print’ or ‘screen’). You will get the best result. It will be saved into the same folder as the PS file. It doesn’t check to see if one of that name already exists, it just charges ahead and overwrites. Single pages can be stitched into an existing pdf document, or swapped with existing pages.

Varying Line Hardness Javier Aparicio writes, We have a HP Design Jet ; we use the colors for achieving clear working drawings. Once our final plots come out on tracing paper, we then make multiple copies on our blue line machine. As with hand drafting, using different colors accomplishes different things. For example: blue prints as 1/2 tone; green prints as 3/4 tone; purple as 1/2 tone; red prints just shy of full deep tone; black as full deep tone; purple does not print; etc......

N GDL, it is possible to save time by CALLing an object you have already made for example, a Window object can ‘call’ a Sash, or a Sink unit can ‘call’ a Tap. These are ‘macros’. However, if the called object is not in a ‘loaded library’ it will not be found, and you will get error messages. The same risk applies to Picture Objects which call PICT or TIFF files. You can use the Load Libraries command in the File Menu to help your project file find them. On Windows machines, omit the three letter suffix when stating its name in the settings box. It is most annoying that there is no pop-up menu of pictures in the loaded library. You just have to know the name. For a special purpose, such as a human-figures Picture object, you could build a Values list of all the known names of PICT/TIFF files and make them easier to select. With 6.5 onwards, you can make a large tiled image of all the small images available and then you can build a pictorial Value list, as shown in the GS window and door objects.

Objects available on the Internet


T is difficult to write about these without one or the other accusing the author of the GDL Cookbook of ‘advertising’, so here is a general note without taking favours, and some names to look for. There are several systems on the Internet offering objects for download. Some of these objects are developed by GDL developers for sale and are useful objects or utilities and cost anything from nothing or a few dollars, to more than a hundred. It depends on the quality. Some of the objects are in fact Libraries, or are PDF (Acrobat) objects, or collections of Texture maps – BMP or TIFF files. Some of the objects are parts of a larger collection (eg People and More) where you can download a single object (such as an ambulance) without having to buy the whole CD. You will also find an increasing number of FREE downloads – of product objects created by or for Manufacturers. The intention is that these should be freely downloadable so that you are encouraged to use their products. For some examples, try these: http:// followed by: www.,, Look in the website for more details of resources on the Internet. If you get seriously into GDL, some of these systems will act as a broker – marketing your GDL objects for you and sending you payments resulting from sales.

Remove that annoying Error message


HEN you start up, you often get the ‘Missing or Duplicate library Objects’ message. Check ‘Load Libraries’. Only load libraries that you need for that project. There are four reasons for this: 1. You probably DO have Missing objects. Find them and make sure that they are in the currently used libraries. Re-load libraries. 2. If not, then you MAY have Duplicates, and this is bad as you take pot luck which ones of the same name load first – maybe the one you spent a lot of time writing or editing will not load – last year’s library object of the same name will load instead and you will not notice until you have spent hours rendering. 3. If not, then you MAY have greyed out libraries in the ‘Load Libraries’ window. If you ignore this you will get the error message every time. ‘Remove’ libraries that you are not using or don’t need. 2.16

4. If not, and you have followed the advice above, then you MAY have material definitions (such as Grass, Walnut, RedBrick etc) which depend on textures to render but they cannot find the library that includes textures. When you buy an object from Internet object stores or from myself, you will always get that error message. In order to keep the file size to a minimum, the object developer will have saved an archive which includes absolutely nothing except the object you want – thus omitting textures etc. When you have created the temporary library folder that came with the archive, copy the new object to your regularly used Library, then reload libraries and all will be good again.

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Professional Standards in GDL (The Checklist for you!! come back to it frequently)

Can GDL be a profession?

Developing GDL Professionally



T the beginning of the Voyager Course, it’s a good point at which to ask how far we (or others who learn it) can take GDL. The normal architectural work you do may not be demanding enough to need all these GDL skills, but you can still see a purpose in continuing with GDL – to build investment objects for your office, to sell your objects to others, or to work with a manufacturer on a product range. Manufactured products – this is a major area where GDL is going. Graphisoft’s Object Initiative is promoting GDL to be a world platform for 3D object description. Every manufacturer who now thinks that it is essential to have their products in DXF should now be thinking about having the same range of products available to ArchiCAD and AutoCAD users in the form of GDL. This will help to get their product specified. When they see the reality of Smart, Parametric working, they understand the benefits of using GDL. Many of their existing libraries can easily be adapted to GDL with a bit of smartness on the part of the GDL author. GDL needs a new class of user – it should be available in a form separate from ArchiCAD. It should be available to lower paid technical staff who just want to do GDL. If Graphisoft are serious about GDL, they cannot expect a new class of dedicated GDL technicians to appear from nowhere, all capable of paying thousands of dollars for the whole of ArchiCAD when they just need a development environment. Metrowerks Codewarrior is available affordably to people who want to dabble in Java, C++ or Pascal. The price for a single box is the same whether you are Adobe or John Doe. In the same way, it should be possible for a computer science or engineering graduate to buy a GDL interpreter and get on with the job of producing some excellent objects – far better and quicker than architects could make. With an affordable development environment, GDL could become the world language of 3D form.* The GDL Alliance, formed in 2000, is committed to developing GDL as a professional activity. The definition of achievement levels, the promotion of GDL as a programming language, the enabling of the creation of a new technician class of GDL writer – these are all part of that mission. Graphisoft have published on the main website a major contribution to the professional GDL debate. A 70+ page technical standards paper lists in detail the requirements for professional GDL writing – downloadable in pdf format. _______

* We may get this I have great faith in GDL Technology Inc willingness to bring this about. ©Copyright Marmalade 1998, 1999, 2000, 2001

F you are a developer these are what you should aim to achieve. If you are a customer, these are what you should expect. These are my list, but the Graphisoft technical paper goes into even greater detail. • Structured scripting: scripts should debuggable and logical, capable of being repaired, extended, updated by you or by others. • Signed and dated: scripts should identify the author (if you take responsibility for your work), date of creation and all subsequent amendments. The filename should include the AC version, e.g. 60, or 65. • Maintainable in future: should be documented with comments for each stage of the script. • Economical LOD: object renders quickly with fewest polygons, and it’s quicker to write. • Scale sensitive LOD: in 2D and 3D – smart. • Stretchy: stretchy objects are more user friendly, but they should NOT stretch if the circumstances are not suitable – if the objects have absolute fixed size. • Appropriate Hotspots: intelligent 2D and 3D hotspots make it easy for the user to pick up, identify and stretch easily (don’t rely on the bounding box!) • Cascading grouped parameters: these are more logical to the user. Group them into logical groups like materials, pen colours, 3D config., 2D quality etc. • User Interface: your object will look more like an API with its extra level of quality – but this quality will take a lot of time to design and write. • Preview window: A 128x128 pixel image in the Preview window box will give you a nice browser icon. • 2D Scripted: objects must not only be good in 3D, they must be quick to draw, look good in the floor plan, and be scale sensitive. • Correct 2D and sectional lines, fills etc.: looks correct in plan view, and when viewed in section. • Self scaling, self orienting labelling: versatile. • Error correcting: prevent crashes or non appearance of the object. Expect the user to enter silly data, or use value lists to guarantee correct data. • Include Material definitions: so your objects are portable between countries and versions. • Consider 3D wireline view: should draw correctly on a pen plotter, not just look good in 3D render. • Property: descriptor and components – essential for schedules. The manufacturer needs this. • Dimensional environment: objects must work when used in any measurement system. • Libraries organised: so you can find objects – group windows, doors, stairs, macros etc. logically in their own folders. Use sensible names that do not replicate existing library parts. 2.17

The GDL Cookbook 3 – Voyager

GDL Syntax – PUT, GET & NSP PUT&GET are written up in the GDL Manual, but in a way that requires ‘considerable perseverance to understand’.1 It does not state what they are used for, and the example given is enough to weaken the stoutest heart. Even when you ‘sort-of’ understand it, it is very difficult to work out what you could use them for. Let’s start by saying that if you want to do anything ambitious with GDL, you have to get a grip on the purpose and use of PUT&GET. At its simplest, a PUT statement Puts numbers (parameters) into a temporary memory. The GET statement Gets them out again. A number called NSP constantly remembers how many parameters are stored at that moment (Number of Stored Parameters). There’s another command called USE. Surprisingly, that can Use the numbers in the store. That’s it! Sounds easy......

Possibilities Once you have got the hang of it, you will then use PUT&GET frequently, even for simple tasks – because it reduces the risk of errors, permits objects that cannot be created any other way, allows you to generate algorithmic shapes; it’s quicker and it’s neater. And it makes stealing from ArchiCAD vastly easier. • Error correction: for almost any 3D shape such as PRISM or REVOLVE, the stated number of XY points must exactly match the actual number of XY points in the list. So, if you build up the list of XY points for a 3D shape in a list of PUT statements, GDL will constantly count up for you how many points there are. Thus you can add or subtract XY points with relative ease and never get an error statement. • Unmakeable shapes: You may wish to make a prism that is the web of a castellated or cellular steel beam with holes drilled in it. You do not know how many holes there are because the beam may be stretchy, and the number of holes in it are constantly changing. Furthermore, you cannot define the holes with fixed dimensions if it is stretchy. You need an algorithm which will define a hole, circular or hexagonal, repeated along the length of the beam. Prism statements normally require a rigorous discipline of the positioning of commas, and getting the number of points right. If you build up the outline of the prism in a PUT statement, then follow it with repeated algorithms for each hole (as many as you need!) these are all stored in the buffer. When you come to produce the beam, a single PRISM statement with GET will get all those points out – in the right order and with commas in the right place! Algorithmic shapes: You can set a FOR... NEXT loop calculating points – perhaps the points on an arch or parabola, using trigonometry. As the loop continues, these values are all stored in the memory buffer using the PUT statement. One easy GET, and you have a TUBE or a PRISM with a curved profile. Quicker: Because you reduce the risk of errors by having your list of points added up for you, it has to be quicker – less time spent staring at an error dialog box. Neater: Prisms and other GDL statements often become pages of numbers and commas that stretch so 1 This is the polite way of putting it, ha ha!


far down the page, you might get lost scrolling up and down trying to remember what the numbers were for. If you are in favour of structured scripting or just a clear visual layout of the script then you can store all the points for prisms in subroutines. Your main script can go down, read in the points, return and produce the prism. e.g.: GOSUB 510:!Put points for beam web PRISM_ NSP/3,0.01,GET(NSP) GOSUB 520:!Put points for flange PRISM_ NSP/3,0.02,GET(NSP)

Each prism becomes a clean one-liner. As the contents of the buffer are Got, they are neatly separated by commas all in the right places so that the syntax is perfect for the PRISM_ statement. Stealing from ArchiCAD: On many occasions, you do not need to write out your own list of XY points – you can draw an outline with the Filltool in the ArchiCAD environment, drag it into the GDL script window and have a good list of XY points. POLY2B has almost the same syntax as REVOLVE, EXTRUDE and many other 3D commands. So the list of XY points can be copied and pasted into the 3D script, preceded with a PUT command, and followed by the 3D command (e.g. REVOLVE) with a GET statement. An example later in this essay will illustrate this process.

You cannot live without it! The Voyager course starts off with PUT & GET, by the use of examples. If you are to do anything ambitious with GDL it is essential to learn the use of PUT and GET, and you will then use it frequently – for all the reasons given here. You need to learn Put & Get to use TUBE. It is also useful in solving difficult COONS and MESH problems.

PUT & GET (etc) ArchiCAD allows you to use an area of memory as a temporary store (or buffer) to hold numbers. The amount seems to be related to the total amount of RAM allocated to AC. PUTting into the memory buffer is a bit like pushing tennis balls through a one way tube. Every time you use a ‘PUT item’ command, that item gets put in the tube. Everytime you issue a GET(1) command, the ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

number that has been stored longest is popped out of the far end of the tube. GET(3) would get 3 items. NSP is a variable (number of stored parameters) that tells you how many numbers are stored in the buffer. GET(NSP) will empty the entire buffer. Where do the numbers all go to when you get them? Well it depends what you are doing when you get them. If you have PUT the correct number of numbers to form a prism, then GETting them will help write out the prism command. Lets try a simple example with Hotspots: PUT 1.0,2.0 HOTSPOT2 GET(2)

!gets 2 numbers

It is in your interest to keep emptying the buffer so that it’s ready for the next time, so it’s better to do this: PUT 1.0,2.0 HOTSPOT2 GET(NSP) !empties buffer

If you have some numbers stored from a previous occasion and not emptied the buffer, then those numbers will be fed into the Hotspot2 command, and you will get an error, either because they are not the ones you intended, or because the hotspot has been given more than 2 numbers. The numbers in the buffer are stored with commas between each one. So when you get them out, they are in the perfect condition to drop straight into a PRISM or EXTRUDE statement and produce a 3D result. For example, if the buffer already contains 4 alternating X and Y points for a prism, (8 points in all) the following Prism statement, ! Name : temp ! Date : Wednesday,May 5,1999 ! Version : 6.00 ! Written by ArchiCAD ! MULX A/ 8.599127 MULY B/ 5.354173 MULZ ZZYZX/ 0.2 ADD 0.012093,5.922268,0.2 RESOL 36 GLOB_SCRIPT_TYPE = 3 GLOB_CONTEXT = 3 GLOB_SCALE = 100 GLOB_NORTH_DIR = 90.0 GLOB_FRAME_NR = -1 This is= what299.259 GLOB_EYEPOS_X GLOB_EYEPOS_Y your =Auto- 165.035 GLOB_EYEPOS_Z = scripted 3D1.7 GLOB_TARGPOS_X = 289.381 Script =looks 184.934 GLOB_TARGPOS_Y GLOB_TARGPOS_Z 1.7 like= GLOB_HSTORY_HEIGHT = 2.9 !!Slab-001 PEN 1 ADDZ -0.2 GLOB_LAYER = "Floors" GLOB_ID = "Slab-001" GLOB_INTID = 3 BODY -1 cPRISM_ "Pine","Pine","Pine", 7, 0.2, -0.012093, -0.568094, 15, -0.012093, -5.922268, 15, 5.991071, -5.922268, 15, 5.991071, -3.618351, 15, 8.587034, -3.618351, 15, 8.587034, -3.196507, 15, -0.012093, -0.568094, -1 BODY -1 DEL 1 ©Copyright Marmalade 1998, 1999, 2000, 2001

PRISM 4,0.5, GET(1),GET(1), GET(1),GET(1), GET(1),GET(1), GET(1),GET(1)

will produce a prism. But this would miss the whole point of using PUT and GET which is to make them do all the hard work and save a lot of typing. This line would be a lot better and do the whole job: PRISM NSP/2,0.5,GET(NSP)

Most 3D GDL commands require you to state in advance the number of points. For example, if the points for a Plane are stored in the buffer then there are 3 numbers for each point – the number of points in the Plane will be NSP/3.

Notes on PUT & GET Sadly, you cannot store strings (text) in the buffer. this would be immensely helpful in property scripting and in self-labelling objects. When you are building a command using PUT & GET, ‘PRINT NSP’ is a way of finding how many numbers are stored – it may reveal the unexpected presence of numbers you PUT previously but forgot to empty. PUT lists are volatile and very limited. If you want to get a number from the middle, you have to ‘empty the balls out of the tube’ till you get the one you want. Once you have a list of numbers from which you wish to selectively obtain or modify numbers, you KNOW it’s time to learn to use Arrays.

Put & Get Practical:1 Look at and modify an Autoscript This is the •first• exercise in the Voyager course, because it is vital to master this technique for most of the later exercises. First, we modify an existing library object. Then we look at how the PUT buffer works. Modifying Library Objects: this script was first looked at in the Discovery Course. Make a quick slab that looks roughtly like the one illustrated here. ‘Save special’ as a Library part, place it in the floorplan, click on it, and open as library object. Look at the 3D script.


The GDL Cookbook 3 – Voyager ! Name :temp – Edited 1st stage ADD 0.012093,5.922268,zzyzx ADDZ -zzyzx MATERIAL matl PRISM 7, zzyzx, This is what it -0.012, -0.568, -0.012, -5.922, looks like after 5.991, -5.922, pruning. 5.991, -3.618, The maskings (15) 8.587, -3.618, have been removed 8.587, -3.197, and the PRISM_ -0.012, -0.568 reduced to a DEL TOP

! Name :temp – Edited with PUT+GET ADD 0.012093,5.922268,0 PUT -0.012, -0.568, -0.012, -5.922, 5.991, -5.922, Now edited 5.991, -3.618, 8.587, -3.618, using PUT and 8.587, -3.197, GET -0.012, -0.568 The number of points MATERIAL matl in the PRISM (7) has PRISM NSP/2, zzyzx, GET(NSP) been replaced with DEL TOP



Editing the Script

Why do this??

Delete most of the rubbish, except for the ADD command (an offset to relocate the ‘origin’ within the object). Make the two parameters zzyzx (for height) and matl (for material). Change the cPRISM to a plain PRISM. Now, after modifying it as in the left hand panel, use copy and paste to modify it further, as in the right hand panel. You can put the word PUT at the start of the list of XY locations; ensure that you do not change the comma positions.

Well now you can prove it to yourself by inserting some extra XY locations somewhere in the middle of the list. Ensure that you maintain the flow of commas. Try to avoid making the prism ‘scissor’ across itself. What you find is that the Prism continues to work. This is because the number of points in the Prism is recalculated each time. As the number of stored points (NSP) is the X and Y of each prism-point, then the number of prismpoints must always be NSP/2.

Put & Get Practical: 2 PUT & GET analysed This exercise shows how the PUT and GET commands work. The Print command displays what is in the buffer. PUT and GET will become a favourite technique with you, once learnt. The use of PUT & GET is a form of single dimensional array, but seriously volatile! When you get it, it evaporates. PRINT This routine will issue print dialogue boxes which show you how the data is stored in the buffer. It’s a bit annoying, but keep pressing ‘Continue’, and you can see the buffer contents reducing as each block is generated. You are unlikely to put this into a Project plan, but if you do, put in a Project2 command for the 2D. NSP (Number of Stored Points) shows the total number of items remaining in the buffer, and as you GET groups of numbers out of the buffer, the NSP reduces. You do not need to know how many items are in the buffer. NSP knows how many there are. When you PUT a string of data in, you must separate each item with a comma. When the PUT buffer is used for a Prism, GDL puts commas in all the correct places when it GETs the numbers. One thing you cannot do is to say FOR k=1 TO NSP, because the value of NSP is dynamically reducing in value every time you issue a GET command. But you can say REPEAT... .... UNTIL NSP=0 if you wish to. USE( ) command enables you to use the contents of the buffer without destroying it, so it can be used again. It’s most useful when you USE the whole contents of the buffer, but here we look at three numbers at a time. Applications: The Staircase, later in the book, is a good demonstration of the situation where you MUST KNOW HOW TO USE the Buffer. The prism is made with a PRISM; if it is to be a parametric stair, you can use a FOR...NEXT loop to store the XYs of the steps. Then, with GET(NSP) (as above) you get the stair drawn for you. 2.20

!Skyscraper with PUT & GET MODEL WIRE PEN pcol !Feed the Buffer with values FOR k=24 TO 1 STEP -1 PUT k NEXT k PRINT USE(NSP) !Display values d=NSP/4 !How many blocks to build? !Build the blocks FOR k=1 TO d BLOCK USE(3) x= GET(1): y=GET(1): z=GET(1) BLOCK x,y,z ADD 2,2,get(1) !Display reducing buffer contents PRINT "x",x,"y",y,"z",z,"nsp",NSP NEXT k END:!----------------------

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager Replace Masking Values with heights, in this case zero and 12 metres

Put & Get Practical: 3 Modify Library Object – again! In this exercise, you should make •two• slabs: and then with PUT and GET, you can make a RULED command which connects them. Each polygonal piece of slab must have the same number of points. Clean the script up as in exercise 1, and you should have two prisms. Remove the end XYM (X-location, Y-location, Mask) point of each prism (because it is a repeat of the first point). Copy and paste the two lists of XYM values to become part of a PUT command, as in the script window here. Make sure that you organise your commas correctly. PUT must be followed by a continuous flow of numbers that are separated by commas, but must end with NO comma. Now replace all the 15’s for the first prism with zero’s – this is a status value, but could also be thought of as the height. Now replace the 15’s in the second prism with a height. In this case, I have changed them to 12 – in RULED, this last number is not a masking value, but means a height – in this case 12 metres.

If this figure (8) is replaced with NSP/6, you would then be able to add more points or change points without difficulty.

You get interesting effects if you deliberately move the X,Y locations on one step, and then tweak the masking value from 63 to something else – see illustration, right. Try it.

Put & Get Practical: 4 Steal this pot This exercise is a quick demonstration of ‘Stealing’ from ArchiCAD, aided by PUT & GET. Using the Origin as a starting point, use the Fill tool to draw the outline of a pot, making sure all your points are in the positive sector. Finish with one ‘silly’ point deep in the negative sector, so your fill doesn’t lose points when you close the polygon and so you can be sure where it occurs in the list. Open a new object and drag this fill into the floating window of the 2D script. Copy the list of XY points and copy them to the 3D script. Edit them as shown here. Make a new materials parameter called matl. Delete You don’t even have to worry about how the the last two XYs (the ‘silly’ point and the 0,0 start point) and knock polylines have been done for the outline of the pot – just copy them! off the last comma. The ROTy command makes it stand up. POLY2_B 11, 3, 2, 91, 0.0, 0.0, 1, 0.0, 0.111191, 1, 0.02142, 0.11125, 1, 0.035254, 0.052108, 1, 0.044696, 0.052161, 1, 0.149492, 0.015667, 900, 0.0, -136.374, 4001, 0.250528, 0.061553, 1, 0.271068, 0.066688, 1, 0.107231, -0.153264, 1, 0.0, 0.0, -1

PUT 0.0, 0.0, 1, 0.0, 0.111191, 1, 0.02142, 0.11125, 1, 0.035254, 0.052108, 1, 0.044696, 0.052161, 1, 0.149492, 0.015667, 900, 0.0, -136.374, 4001, 0.250528, 0.061553, 1, 0.271068, 0.066688, 1 MATERIAL matl ROTy -90 REVOLVE NSP/3,360,0,GET(NSP) DEL 1

©Copyright Marmalade 1998, 1999, 2000, 2001

Emptying the buffer This routine will empty the buffer if you do not know how many numbers are in there. Use x or any temporary variable that you are not presently using. WHILE will only carry out the command if NSP has a value. WHILE NSP DO x=GET(1) ENDWHILE


The GDL Cookbook 3 – Voyager

Advanced 3D Commands TUBE


UBE is a profoundly useful command. You can draw a profile through a series of X-Y-Z points in 3D space, thus creating complex frameworks without having to use Trigonometry. TUBE does its best to work out a mitring solution at each change in the pathway. TUBE Profile –With TUBE, you define the 2D outline/profile, just as you do in Extrude or Poly2. TUBE Pathways – You define a number of path points that the section must pass through – as in Sweep. At each joint, GDL mitres the junction. Design Problems: Because the Mitring and Rotational angle can be set with each joint, TUBE requires a Starting and Ending Direction, so it knows how to treat the start and end surfaces. So you must position a ‘Phantom Start’ and ‘Phantom End’ point. This will correctly mitre the start and end of the tube object. You need to type in some examples to appreciate quite how it works. The example here puts a black ball at each phantom point. The Pathway is defined in XYZ locations – a bit like in Sweep. In

!TUBE Demonstration !Syntax:- TUBE n,m,mask, ! section-> u1,v1,s1,...un,vn,sn, ! pathway-> x1,y1,z1,twistangle1,... ! ->...xn,yn,zn,anglen LET p=0.05 !one pixel BODY -1 TUBE 4,5+2,63, Note, here, the 0,0,0, use of ‘p’ to save 0,p,0, having to type in p,p,0, many zeroes. p,0,0, 0 ,0 ,-p ,0, !phantom start 0 ,0 ,0 ,0, !real start -p ,0 ,p*3,0, p*2,0 ,p*4,0, 0 ,0 ,p*5,0, 0 ,0 ,p*6,0, !real end 0 ,0 ,p*7,0 !phantom end BODY -1

!Display Phantom points MATERIAL 0 ADD 0,0,p*7 SPHERE 0.01 DEL 1 ADD 0,0,-p SPHERE 0.01 DEL 1

Phantom Start and End In this script, a little ball has been placed at the Phantom Start & Phantom End points to illustrate the principle.

TUBE works out its own mitres, and wierd things happen if you start trying to twist the section. For safety, always use a mitre/twist value of zero. In this example, I have used the mysterious command called BODY -1 which does an integrity check on the 3D form. It’s a lifesaver with TUBE which can often display irrational errors.

Sweep, the section changes by the same scale and angle change, and moves from XYZ point to XYZ point. In Tube, the section remains constant, but you can have a different twist angle, at each mitring opportunity. TUBE works best if the section is kept simple, and is axially centred on the origin – like a cylindrical or rectangular profile. One trick you can do is to lay out a floorslab in plan, save it as a temporary library object, and then steal the XY locations, copying and pasting them to a TUBE command. These can be the path or profile points for a Tube. This is how the Add-On ‘Profiler’ works. Masking: 1=Base surface, 2=End surface, 16=Base edges, 32=End edges, 64=Cross section edges visible

TUBE+TUBEA Mental Health Warning!


TUBE is by far the easiest way to accomplish complex lattices like this. As TUBE only needs to know the XYZ locations of the ends, you do not need to move or rotate the cursor


UBE causes more grief that most – because if you don’t get it right, you get error messages. Once you understand it, though, you may find yourself typing in TUBE scripts with confidence. My solution is to use a series of PUT statements first to ensure that one major source of syntax errors is removed. However, the way that the sectional outline is drawn in TUBE is verging on the irrational. It is supposed to follow the ‘looking from above’ rules of the other 3D elements. But then it jumps about the origin once the location points are entered. It works more reliably if the direction of the tube is mainly horizontal.A lot of trial and error may be involved to get it right. A BODY -1 command before and after the TUBE is advisable. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager



RCHICAD 6.x has a TUBEA command. It’s different from TUBE, in that there is no Twist Angle involved at each junction; it is not better than TUBE, just different. The section defined is drawn onto the YZ plane using the same syntax as REVOLVE (which has to be drawn onto the XY plane), and is ‘extruded’ along the X axis. The section defined is the section at the mitres, so there seems to be a danger of the actual linear section changing erratically along its length if the pathway is moving a lot. A good feature is that if you leave the section description unclosed, it will force the section to ‘grow’ downwards to meet the XY plane, like a wall of changing height.



ESH – is limited by being applicable to rectangular entities only. However, it is easy to use, as you only need to enter the Z – the height – of each point. Write the mesh out with all points zero at first. Set them out with the same grid as the ‘n’ and ‘m’ factors. Then try tweaking some points upwards. MESH – Try putting in some heights to tweak the terrain up and down. Unfortunately, as you view it in the script and then in the window, the positions of the meshes appear inverted. The bottom left on the mesh is the top left in the script. The top right of the mesh is the bottom right in the script. It is as if you were viewing it from upside down.

PEN 1 MATERIAL 'surface-whitewash' PUT -1.0,1.4,0, 0.0,2.8,1, 1.2,1.5,1, 1.2,1.0,1 profpts=NSP/3 PUT -1,0,0, 0,0,0, 2, 1, 1, 3, 1, 1.6, 4, 1, 1.6 pathpts=(NSP-profpts*3)/3 TUBEA profpts,pathpts,63,GET(NSP)

TUBEA needs phantom points just like TUBE, so the example here shows the finished object, and the phantom points in wireline. Phantom start and stop points tell the object how to mitre its ends. The routine uses PUT & GET, profpts and pathpts and is a classic way of doing TUBE and TUBEA with the lowest risk of errors. This method ensures that you know where the definition of the profile ends and where the pathpoints begin. Masking: 1=Base surface, 2=End surface, 16=Base edges, 32=End edges, 64=Cross section edges visible !MESH Demonstration !Syntax: MESH a_width,b_length, ! m,n,mask, ! z11,z12,z13,z14,..z1m, ! z21,z22,z23,z24,..z2m, ! ...zn1,zn2,zn3,zn4,..znm MESH 15,12,6,5,63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

!MESH Demonstration MESH 15,12,6,5,63, 1,0, 0, 0,0,0, 0,0,-1, 0,0,0, 0,0,-1,-1,0,0, 1,0, 1, 2,2,2, 1,2, 4, 7,6,4

Masking: 1=Base surface, 4=Side surface, 16=Base & side edges, 32=Top edges, 64=Top edges & surface rough.

Hot MESH Tip!

!MESH Demonstration


MULy -1 MESH 15,12,6,5,63, 1,0, 0, 0,0,0, 0,0,-1, 0,0,0, 0,0,-1,-1,0,0, 1,0, 1, 2,2,2, 1,2, 4, 7,6,4 DEL 1

f you precede the MESH command with a MULy -1 then the script and the object will be the same way up, and it is easy to enter heights (even though the top left corner is now at the origin).

Start off with a flat mesh (all the heights at zero), then tweak the points up and down.

Above – it appears inverted Below – it now appears corrected with the MULy -1 command

Notice that the grid is rectangular, but if a surface within a rectangle of the mesh is not planar, it is divided into two triangles, and thus can be rendered as two planar surfaces. With triangular subdivisions, ANY surface, however complex can be rendered. It could be quite useful for doing a site, but you cannot drill holes in it, or increase local detail, or vary its outline. The MASS command (new with AC6.x) is more useful for sites, and permits holes to be drilled. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

COONS Freeform surface making


OW we come to one of the most intriguing 3D Commands of all – COONS. I used to theorise that this meant something like Coordinated Network Surface, but when I asked Graphisoft, it turned out to be named after a mathematician called Robert Coons who is admired by the programming team! By defining the XYZs of the cornersand edgepoints of a rectangular object, GDL will try to work out all the in-between locations; the whole surface will be rendered as a myriad of small triangles. It can therefore adopt any shape. The overall object need not be an exact Rectangle – it just requires 4 corners (so that it is ‘quasi-rectangular’), and almost anything can happen in between. GDL interpolates and smooths all the points over the surface. More complex surfaces can be made up with tiles of COONS elements. Sometimes the edge points are determined by mathematical procedure, not by guesswork, so for this you MUST use the PUT statement. Start with the corners only: If you follow the rigorous discipline of Points 1 to 2, Points 4 to 3, Points 1 to 4, Points 2 to 3, then you will be able to use COONS successfully. Once it works, then insert the interpolated points along the edge. Don’t forget to increase the stated number of points on the first line of the statement.

Use this method! I have evolved a fairly unburstable routine for doing COONS successfully, and very rarely get an error using this method. Try this one out.

!COONS Demonstration !Syntax:- COONS n,m,mask, ! all XYZs from Point 1 to ! all XYZs from Point 4 to ! all XYZs from Point 1 to ! all XYZs from Point 2 to COONS 0.0, 0.0, 2.0, 2.2,

2,2,63+64, 0.0, 1.0, ! 1 to 2 2.0, 1.5, 0.0, 0.7, ! 4 to 3 2.4, 1.9,

0.0, 0.0, 1.0, ! 1 to 4 2.0, 0.0, 0.7, 0.0, 2.0, 1.5, ! 2 to 3 2.2, 2.4, 1.9

Do it with PUT & GET


OONS statements can get very long, and increasingly complex. The same applies to MASS. Once this happens the chance of errors increases. By using a series of PUT statements to ‘build’ the coons or mass, and by using an NSP statement to define the number of points on the surface, you will have greater freedom to interpolate edge points. I also use PUT and GET for most Prisms and Tubes – it reduces syntax errors.


63 is the best mask, 127 reveals the triangles, and can be written as 63+64

Masking: 4=1st boundary edge, 8=2nd boundary edge, 16=3rd boundary edge, 32=4th boundary edge, 64=Top edges & surface rough. Even in AC_65, none of these maskings seem to work except 64. It seems impossible to control 3D line representation. If you make a complex surface from several tiles, the viewer can see how you have tiled it.

!COONS Demonstration COONS 3,2,63+64, 0.0, 0.0, 1.0, ! 1 to 2 -0.1, 1.0, 1.1, 0.0, 2.0, 1.5, 2.0, 0.0, 0.7, ! 4 to 3 2.3, 1.2, 1.1, 2.2, 2.4, 1.9, 0.0, 0.0, 1.0, ! 1 to 4 2.0, 0.0, 0.7, 0.0, 2.0, 1.5, ! 2 to 3 2.2, 2.4, 1.9

Hot Tip!

2 3 4 3

The example here happens to have an XY location of 0,0. You don’t have to move the cursor to the start of the command.

!COONS Demonstration COONS 3,3,63+64, 0.0, 0.0, 1.0, ! 1 to 2 -0.1, 1.0, 1.1, 0.0, 2.0, 1.5, 2.0, 0.0, 0.7, ! 4 to 3 2.3, 1.2, 1.1, 2.2, 2.4, 1.9, 0.0, 0.0, 1.0, ! 1 to 4 1.0,-0.2, 1.0, 2.0, 0.0, 0.7, 0.0, 2.0, 1.5, ! 2 to 3 1.1, 2.2, 1.4, 2.2, 2.4, 1.9

Inserting additional pairs of XYZ points in the COONS makes the mesh more shapely – the more you put in, the smoother the result.


K! so COONS looks terrifying. But if you take the gradual, systematic approach demonstrated here, you can get COONS to be useful for you. It is the only way to do smooth interpolated surfaces in ArchiCAD. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager


ASS is good. MASS is very good. It is the GDL equivalent of the Mesh tool in AC6.x, and forms a surface from a number of X-Y-Z node locations by resolving the resulting surface into triangles. It is a great help for surface and site making. A neat trick is to use the mesh tool direct in AC to get the basic shape worked out, then you can edit the details of the resulting MASS script in GDL. With some thought, you could generate new shapes with MASS such as trigonometrical or random surfaces, an interesting adventure to try some time. After the opening lines of materials and masking, you first define the XYZ nodes in the boundary. Then, if you have any points within the surface, you define them as a series of small ‘ridges’ or single points, each ending in a -1 masking code. As the ridges are added, the whole surface responds with yet more triangles to ensure that the whole surface will shade. By playing with the object mask, you can also show or omit the side wall (skirt) or the base, and invoke object smoothing.

MASS topmat, botmat, sidemat, numbextpoints,numbintpoints,mask,skirtheight, xe1,ye1,ze1,se1,...xen,yen,zen,sen, list of external points, xi1,yi1,zi1,si1,,yin,zin,sin, list of internal points

The difference between COONS and MASS in a Nutshell


OONS makes a skin, and requires you only to describe the edges of a surface and it tries to interpolate all the other points – sometimes producing excellent results – but sometimes it smooths the surface in a way that you do not like. If the surface is too complex in shape to tolerate smooth interpolation because it has more complex detail (pointy bits), MASS will allows you to be more prescriptive about the exact height of points, in addition to making skins or solid objects – but then you will not get the smooth interpolation. Both are difficult to write.


ASS has the advantage that you can build it in ArchiCAD’s normal project window with the MESH tool, then copy it to GDL and edit to its final form. COONS can only be built the hard way. MASS permits holes to be drilled, or plateaux to be formed. MESH: How does MESH compare with these? Don’t even think about it! Very few things in the 3D world are perfectly rectangular, but worse, you have to calculate every blessed point height in the MESH.

The XYZ’s of Holes are considered to be ‘external points’, but they need a minus 1 after the external shape, as in PRISM_holes. The end of the definition of the perimeter is marked by a masking code of -1, and the later XYZ definitions are ridges or points – also each ending in a -1. The overall object masking code (here, 32) can decide if the sides or bottom are to be displayed, or if the object is to appear smooth in renderings. Masking: 1=Show base, 4=Show skirt, 16=Show edge lines for base and skirt, 32=Edge lines for top are visible, 64=Top edges visible, top surface is not smooth.



o, sorry, SKIN does not exist. But it ought to. If you had a SKIN command which was a combination of RULED, TUBE and SWEEP, how happy we would be. The syntax would be to state the number of points in the section, the number of pathway points, and then a sequence of Skin polygon definitions, and angle. The function would then skin the results to form a shape. My friend Oleg Shmidt has written a GDL Macro called LOFTER that does just this, although it is complex to use. Let’s hope Graphisoft adopt something like LOFTER in a future edition.


OST 3D commands require you to enter the ‘number’ of XY and perhaps Z coordinates in the object, e.g. RULED 6,63 means that there are 6 points on the shape, with a mask of 63. Similar rules apply to REVOLVE, SWEEP and most complex 3D forms. Masking Values: All complex 3D commands use a Masking value for the whole object – usually 63. Each command has a different way of using these. Although the Cookbook is not intended to be a total replacement for the manual, I have printed the keys to these values for every GDL object command. For more detail, try delving into the manual, where they are quite well explained once you have got used to the jargon. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager



ULED gives you a ‘tweaked’ solid – whereby you lay out the plan first, and specify an equal number of points higher than the base (by their X-Y-Z location) and it will try to form the solid. RULED is most useful, even though it lacks Polylines. You always have to start from flat on the local X-Y plane, and define the lower lines in the same way as you do for Extrude. Use Status values of zero (0). The XYZ locations of the upper points can, theoretically be anywhere. But they should still be planar if possible. If the top is not planar, it may not draw properly. The sides will draw even if they are not planar, as they resolve into triangles. However, you can take risks with the sides and it will subdivide the surfaces into triangles in order to make them capable of rendering. The mask is 63 (as usual) if you want a top and bottom drawn.



WEEP – pulls a 2D outline (defined on the X-Y plane) upwards through a series of pathway points. SWEEP is also capable of twisting the 2D outline, and rescaling it as it passes. It also attempts to mitre the joints on the way. If the sides are not planar, it tries to divide them into triangles to get the best shading effects.

!RULED Demonstration !Syntax:- RULED n,mask, ! u1,v1,s1,...un,vn,sn, ! x1,y1,z1,...xn,yn,zn LET p=0.05 !one pixel RULED 6,63, p ,p ,0, Status: for XY lop ,p*4,0, cations: 0=vertical p*4,p*4,0, line drawn, 1=verp*4,p*2,0, tical line omitted. p*2,p*2,0, p*2,p ,0, !No polylines are possible in the p ,p ,p, outline p ,p*4,p, p*4,p*4,p, p*4,p*2,p, p*2,p*2,p, p*2,p ,p,

This is one solid where you should NOT close the polygon. When you get to the penultimate point at the lower level, start defining the upper level. This is because RULED is usable for sheets, not only solids. See the CURTAINS exercise for an example of this.

!RULED Demonstration LET p=0.05 !one pixel RULED 6,63, p ,p ,0, p ,p*4,0, p*4,p*4,0, p*4,p*2,0, p*2,p*2,0, p*2,p ,0, p ,p*2,p, p ,p*4,p, p*3,p*4,p, p*3,p*3,p, p*2,p*3,p, p*2,p*2,p Masking: 1=Base surface, 2=Top surface (if planar), 4=Side surface, 16=Edges on planar (base) curve, 32=Edges on space curve, 64=Side edges edges visible, object rough.

Use a 3D ‘Pixel’ size Notice a neat trick that I have used here. If you can define your smallest dimension, in this case 0.05 metres, as an ‘object pixel’, you can use the variable ‘p’ instead of typing out dozens of decimal figures.

!SWEEP Demonstration !Syntax:- SWEEP n,m,alpha, ! scale,mask, ! u1,w1,s1,...un,wn,sn, ! x1,y1,z1,...xn,yn,zn LET p=0.05 !one pixel SWEEP 6,3,15,0.7,63, p ,p ,0, !Outline of section p ,p*4,0, p*4,p*4,0, p*4,p*2,0, p*2,p*2,0, p*2,p ,0, 0 ,0, 0, !Pathway begins p ,p,p*3, p*2,0,p*6

Masking: 1=Base surface, 2=Top surface, 4=Side surface, 16=Edges on base, 32=Edges on top, 64=Side edges edges visible, object rough. Status: for XY locations: 0=vertical line Sweep can be erratic to control – but drawn, 1=vertical line omitted.

there are times when it is the only solution to a problem.



YRAMID – it takes the outline (using the same syntax and status values and masking as described as in EXTRUDE) and pulls all to one point at 0,0, on the Z-line. It is useful for building a church spire (the example in the AC 6.x manual)

!PYRAMID Demonstration !Syntax:- PYRAMID n,height,mask, ! x1,y1,s1,....xn,yn,sn PYRAMID 9,0.3,63, 0.00,0.00,0, -0.10,0.30,0, 0.10,0.30,0, 0.10,0.40,0, 0.20,0.40,0, 0.20,0.10,1000, 0.15,0.10,0, Masking: 1=Base surface, 4=Side surface, 0.15,0.00,0, 16=Edges on base 0.00,0.00,-1 Status: for XY locations: 0=vertical line drawn, 1=vertical line omitted.

Pyramid supports Polylines


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager



XTRUDE – allows you to define an outline, and then lift it to a different XYZ location. Simple as that. Along with the other similar commands, the subtle variations offered by Polylines, Status values and Masking values can help. With 63 as mask, the whole form is drawn. Extrude can give you skins or solid forms.

Masking: 1=Base surface, 2=Top surface, 4=Side (closing) surface, 16=Edges on base, 32=Edges on top. Status: for XY locations: 0=vertical line drawn, 1=vertical line omitted.

EXTRUDE – Masking value here is 1 (one) which means draw the bottom, but no top, no top or bottom edge lines. (Vertical lines are controlled by Status values)

!EXTRUDE Demonstration !Syntax:- EXTRUDE n,dx,dy,dz,mask, ! x1,y1,s1,....xn,yn,sn EXTRUDE 9+2,0,0,0.1,16+32, 0.00,0.00,0, -0.10,0.30,0, 0.10,0.30,0, 0.10,0.40,0, 0.20,0.40,0, 0.20,0.10,1000, 0.15,0.10,0, 0.15,0.00,0, 0.00,0.00,-1, 0.05,0.1,900, !hole 0.05,360,4000 !hole RETURN

EXTRUDE – Masking value here is 63 above, all surfaces visible.

EXTRUDE – Masking value here is 0 above, only the edge surfaces visible. (Vertical lines are controlled by Status values)

EXTRUDE – Masking value here is 2, which means draw the top surface, but omit the upper edge lines.

EXTRUDE – Masking value here is 32+16, which means draw neither top nor bottom, but draw the upper and lower edge lines for top and bottom.

If you have typed in the previous EXTRUDE commands, play with different ways of writing masking values. Notice that for all these examples, the same set of X-Y values are used – so you can copy and paste, then modify.

More about masking codes Try playing with the masking values for the sides of a Prism. This is the easiest way to understand Masking. Objects can have masking values too. The masking values relevant to a 3D object are different for each object; for example, in a REVOLVE, you can have the ends open or closed, whereas this would not apply to a COONS. With MASS you have masking to decide whether to show a side skirt or bottom panel. Some masking codes do not work correctly. For example, with a code of 0 for COONS, you still get edge lines. With FPRISM, you get lines even if you apply codes of zero. Very annoying! With EXTRUDE you have a set of choices illustrated, above. For each GDL command you have to check here or in the manual what the object masking codes will do. 1, 2, 4 and 8 are usually to do with the solid qualities (closed or open end etc); 16 and 32 are to do with line drawing. 64 will roughen the object by drawing all the construction lines. 64 is very useful for checking how the triangulation of polygons is working.

©Copyright Marmalade 1998, 1999, 2000, 2001

!EXTRUDE Demonstration EXTRUDE 9+2,0,0,0.1,16+32, 0.00,0.00,0, -0.10,0.30,0, etc, etc....

Analytic way of writing a masking value

You can write codes analytically You can write masking values as single numbers, or you can use them analytically, as shown here below. It does not slow down the machine to read this, but helps you remember what you put in or left out. You can also multiply the numbers by Boolean flags of 1 or zero, which switch the values on or off. For example, if you wanted 27, you could write: 32*0 + 16*1+ 8*1+ 4*0+ 2*1 + 1*0 2.27

The GDL Cookbook 3 – Voyager

Polylines explained fully P

OLYLINES are the very stuff of getting effective power out of the 3D commands in GDL. Polylines are used in 3D and in 2D. If you make a 2D fill object in the floor plan, complexify it with many curves, drag it into the 2D script of GDL, you will see that polylines are used, mostly 900 and 4000. You can use polylines in creative GDL, indeed, if you do not use them, your objects will have hard angular lines to them, and you may also be missing out on the labour saving benefits – polylines can save you a lot of trigonometrical and other calculations. !Plain Prism PUT 0.00,0.00,0+15, -1.00,3.00,0+15, 1.00,3.00,0+15, 1.00,4.00,0+15, 2.00,4.00,0+15, !<--New points inserted here-> 2.00,1.00,0+15, 1.50,1.00,0+15, 1.50,0.00,0+15, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)


The basic idea of Polylines, Status and Masking codes is covered in Discovery, and if you are now a Voyager, you should by now be happy with reading more about it them. Many of the Voyager exercises illustrate ways of using Polylines, Masking and Status values. Here are illustrations of full range of Polylines. I hope you will be tempted to try them more often. The statements are done with PUT & GET which make it easier to insert and remove lines without causing an error.

!Prism using 100: !'turtling' dy,dx !location increments PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15, 0.5,-0.5,100+15, 0.0,-0.5,100+15, -0.5,-0.2,100+15, 2.00,1.00,15, 1.50,1.00,15, 1.50,0.00,15, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)


Polyline 0: This is the standard prism we have already used for examples of 3D forms. It is PRISM_ which requires a masking code of 15 at the end of every line, and -1 at the end. The polyline value is zero (i.e. we don’t use or need one) so it is shown here, just to prove that a zero value is valid.In these cases, ‘s’ is the masking factor for the prism or poly.

Polyline 100: dx,dy,100+s – is for incremental changes from point to point. You do not need to know the Absolute value of the location, only how far it is from the previous one.

!Prism using 200: !length and angle direction PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15, 0.8,300,200+15, 1.2,240,200+15, 2.00,1.00,15, 1.50,1.00,15, 1.50,0.00,15, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)

!Prism using 300: !tangential segment PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15, -0.2,-0.5,100+15, 0.8,0,300+15, 2.00,1.00,15, 1.50,1.00,15, 1.50,0.00,15, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)



Polyline 200: len,ang,200+s – is for length and angle changes from point to point. You do not need to know the Absolute value of the location, only how far it is from the previous one and in which direction. The angles are based on those in your 3D settings box – zero is to the right, 90 is upwards, 270 is downwards. 2.28




Polyline 300: len,0,300+s – tells the line to continue in its current direction for a stated length. You do not need to know the Absolute value of the location, only how far it is from the previous one. The direction is determined by the preceding line.


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager !Prism using 600+700 !starting point, closing PUT 0.00,0.00,600+15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15, 2.00,1.00,15, 1.50,1.00,15, 1.50,0.00,700+15 PRISM_ NSP/3,1.5,GET(NSP)


Polyline 600, 700: len,0,300+s, tell the line where to start and stop. This is useful if using relative (based on 100: and 200:), not absolute coordinates. The 700 is a bit like the ‘go to jail’ card in monopoly. Whatever you put in the XY field before it is ignored – the line goes immediately back to the start.

!Prism using 800 and 300 !set tangent, draw tangent PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15, -0.5,-1.0,800+15, 1.5,0,300+15, 2.00,1.00,15, 1.50,1.00,15, 1.50,0.00,15, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)


Polyline 800: dx,dy,800+s, defines a direction for the next line to go in, not based on angle but based on a relative move of dx,dy (incremental xy move). The following line can be a tangential jump (300: or 1000:) which will make use of that direction.

!Prism using 1000 !tangential curve PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15, 2.00,1.00,1000+15, 1.50,1.00,15, 1.50,0.00,15, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)

!Prism using 1000 !tangential curve PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15-2, 2.00,1.00,1000+15-2, 1.50,1.00,15, 1.50,0.00,15, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)



Polyline 1000: x,y,1000+s, This value is added to an existing point and tells the line that is about to arrive from the previous point to take off, orbit and land tangentially on the point that is so numbered. If the take off and landing line are nicely aligned, you get a very good rounded effect. If they are not, you can get some curious bulging effects.

!Prism using 2000 !tangential curve for !a defined angle PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15-2, 1.4,-120,2000+15, 1.50,1.00,15, 1.50,0.00,15-2, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)

Polyline 1000: x,y,1000+s, This often results in a hideous number of vertical lines that spoil the look of the object. RESOL determines how many lines you are going to get. By changing the 15 to 13 in the two affected points, you will be able to remove the vertical visible lines. The number of polygons visible can still be controlled with RESOL.

!Prism using 900 and 3000 !set centre, draw curve !around centre, to a point PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15-2, 2.0,2.5,900+15, 2.9,1.0,3000+15, 1.50,1.00,15, 1.50,0.00,15-2, 0.00,0.00,-1 PRISM_ NSP/3,1.5,GET(NSP)


Polyline 2000: rad,angl,2000+s, Polyline 3000: x,y,3000+s, This is similar to 1000 in that it This will arc around a previorbits with from the last point to ously defined centre, and will arrive as wards the next point, but only goes near as possible (but not always ON) a specified angular distance. a stated XY location. Polyline 900: x,y,900 defines centre. ©Copyright Marmalade 1998, 1999, 2000, 2001







10 2.29

The GDL Cookbook 3 – Voyager

Polylines with masking or status codes at nodes are used in many GDL elements: POLY_ PRISM_ CPRISM_ BPRISM_ FPRISM_ SPRISM_ CROOF_ EXTRUDE PYRAMID


!Prism using 900 and 4000 !set centre, draw around centre PUT 0.00,0.00,15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15-2, 2.00,1.00,1000+15-2, 1.50,1.00,15, 1.50,0.00,15-2, !last useful pt 0.00,0.00,-1, !last point 2.0,2.5,900+15, 0.9,360,4000+15 PRISM_ NSP/3,1.5,GET(NSP) !Thin post ADD 2.0,2.5,0 CYLIND 3,0.02 DEL 1


Polyline 4000: r,angl,4000+s, This will arc around a centre by a stated angl, to a stated radius. Polyline 900: is required to define the centre first. If drilling a hole through a prism, you can only to an angle of 360˚. If you define the corner points, you can cut pie shaped holes with an angle <360. If you wish to avoid vertical lines in the hole, you have to put the 15-2 masking code to the last known useful point in the prism. The point that ends with -1 is not that one, because it is only there to tell the prism that it has closed.

!Prism using 900 and 4000 !set centre, draw around centre PUT 0.00,0.00,15, 0.0,1.5,900+15, 0,-90,4000+15, -1.00,3.00,15, 1.00,3.00,15, 1.00,4.00,15, 2.00,4.00,15-2, 2.00,1.00,1000+15-2, 1.50,1.00,15, 1.50,0.00,15-2, 0.00,0.00,-1, 2.0,2.5,900+15, 0.9,360,4000+15 PRISM_ NSP/3,1.5,GET(NSP) !Thin posts ADD 0.0,1.5,0 CYLIND 3,0.02 DEL 1 ADD 2.0,2.5,0 CYLIND 3,0.02 DEL 1



Polyline 4000: r,angl,4000+s, This will arc around a centre by a stated angl, to a stated radius. If it is not drilling a hole, it will work correctly – clockwise is negative, anti clockwise is positive. If the 4000 is used as part of an outline, the radius is ignored (you can write zero) because it assumes that the radius is from the point concerned to the defined centre.

Tips and Tricks Lost your Toolbar?


INDOWS users! There is nothing in the preferences or display settings or in the manual that can help you. Do you despair? No, because you can ‘right-button’ click the grey bar at the bottom of the ArchiCAD screen and get it back.



By the way, the thin poles at the centres are there for illustration, they are not placed there by the polyline 900: The 4000 polyline in the outline curves through 90˚ and uses the distance from the start point to the defined centre as its radius.

A practical use for FRAGMENT2... Most existing manufactured products are provided by manufacturers in DXF or DWG. If you are converting them to GDL, you can combine 3 files into one by pasting each image to a different fragment, then having a simple value list to choose whichever you want. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Advanced 2D



RAGMENT2 is a system of layering in the 2D environment of GDL. All 2D lines, text, circles etc that you would normally draw in a 2D symbol are put into the top draw- Under AC_6.x, it is a lot easier to ing layer, called Fragment 1. Now hide and show the Fragments try this – open the 2D symbol window, click in the toolbox on the line tool and select all, it will select all ment. You can draw directly in a the lines in the symbol. Now Cmd- fragment, but have to ‘choose’ that T for the settings and you are offered as the drawing fragment first. the chance to move it all to a different layer (just like, in 3D, you can Turn Fragments on and off move a roof object to the Site and In the Library part main dialog box, landscaping layer, if it is a sloping you will find that all fragments are lawn). Select Fragment 2. normally displayed, as a series of If you are using a complicated dark or light numbered buttons. But symbol, you might have to repeat click on the buttons (popup menus this process for all Text, Circle and in AC5), and you find that you can select all, or one only, or any group Fill objects. Once the whole symbol is in of fragments to be displayed. Normally when a 2D symbol Fragment 2, you could draw another symbol into Fragment 1, and then is drawn, it is immediately disamove it by the same process to Frag- bled when there is an active 2D ment 3. In this way, you could build script. However, the two work up a whole series of quite different together if the FRAGMENT2 comdrawings or images in each frag- mand is invoked.

Syntax: FRAGMENT2 fragment_number, use_attributes

• If the attribute flag is 0, the 2D fragment appears with the pen colours and line types etc as it was drawn. • If the attribute flag is 1, the 2D fragment appears with the pen colours and line types etc as specified in the script or settings box.

A timesaving use for FRAGMENT2...

©Copyright Marmalade 1998, 1999, 2000, 2001 in my Human Figure model. It has a number of preset positions, such as running, jumping, sitting and standing. As Project2 is too slow to wait for, each pose is stored as a 2D symbol in plan view and saved into different fragments.

FRAGMENT2 in action For a very simple example, suppose you had a Chair object that had 5 different Styles. A style might be chosen with a number, or with a value list. For examples of the styles, 1=a stool; 2=chair with a back; 3=chair with arms and back; 4=chair with arms and back and headrest; 5=chair with arms and back and headrest and footrest. Now if you used a PROJECT2 command, there could be an unacceptably long wait while the whole object had to be converted to a 3D plan view before it would come up in the Project Plan window.

Procedure For AC5: Set a chair to each style, then view it in Plan, and send ‘3D View to Symbol’. It will go into Fragment 1. For AC6: Place the object in the Project Plan. Configure to the required shape, select it, then Explode it. ‘Cut’ the resulting lines, and paste them into the 2D Symbol window of the GDL object. The pasted result will be put into Fragment 1.

Put the lines into fragments Start with style 5; now select all lines in the symbol, Cmd-T (Ctrl-T for PCs) the lines and move them all to Fragment 5. Fragment 1 should now be empty. So now do the same for style 4 and so on, down to 1. In the 2D script, include a routine like this: IF IF IF IF IF

cstyl=1 cstyl=2 cstyl=3 cstyl=4 cstyl=5



1,1 2,1 3,1 4,1 5,1

!the 1 after the command is !an attributes flag. !Leave it as 1.


The GDL Cookbook 3 – Voyager

Fragment Tester T

HIS EXERCISE takes the cover off the mystery of how to use the FRAGMENT2 command. It also demonstrates the use of the stretchy properties of ‘A’ as a joystick to change an object. Fragments are used a bit like you could use Layers in 3D ArchiCAD. In 3D Project window, you can click on an object, and put it into the ‘Landscaping’ layer, or the ‘Roofs’ layer, or ‘Special constructions’. In 2D, you have layers (or fragments) numbers 1, 2, 3, 4, etc. up to 16. Anything you draw initially gets stored in Fragment 1, but can be moved to another fragment by you. You can display all Fragments, or any combination. 2D symbols in the project plan are generated in one of three ways: • A 2D Symbol that has been drawn by yourself, or copied and pasted from the main project window into the symbol window. • A 2D script that you have written, and that uses the parameters in the library box. • A 2D symbol that is stored in fragments, that could be one of several 2D images that you may previously have drawn, and which is revealed as a result of your script. • A combination of these. The 2D symbol could be mainly scripted and could pull in and include different fragments – a roof detail could pull in different tile profiles. OK, this example is somewhat lighthearted, but you will find a more serious use explained in the section on DXF conversion of manufactured objects.

Illustrations of Fragment 1: Typical view in ArchiCAD of the object with a small value of A. 2: Click on buttons in the Fragments Button bar to hide or display fragments.

3: Draw what you want to draw in each fragment, using the 2D drawing tools. 4: Select all 2D objects and move them to the final fragment. 5: In this example, there are 6 different fragments, and the cross hairs are put in to show how the fragment changes as the stretching hotspot moves sideways.

!Fragment Tester HOTSPOT2 0,0 HOTSPOT2 A,0 !Stretchy hotspots IF A<0.1 AND A>0 THEN FRAGMENT2 1,1 IF A<0.2 AND A>0.1 THEN FRAGMENT2 2,1 IF A<0.3 AND A>0.2 THEN FRAGMENT2 3,1 IF A<0.4 AND A>0.3 THEN FRAGMENT2 4,1 IF A<0.5 AND A>0.4 THEN FRAGMENT2 5,1 IF A<0.6 AND A>0.5 THEN FRAGMENT2 6,1 IF A>0.6 THEN FRAGMENT2 7,1 !Cross hairs for joystick LINE2 A,0.02, A, -0.02 LINE2 A-0.02,0, A+0.02,0 CIRCLE2 A,0,0.01 FOR k=0 TO 0.6 STEP 0.1 The 7 line fragment2 routine could be ADD2 k,0 tightened up greatly. HOTSPOT2 0,0 Here, it could be rewritten LINE2 -0.01,0,0.01,0 LINE2 0,-0.01,0,0.01 as simply:DEL 1 x=MIN(7,INT(A*10)+1) NEXT k FRAGMENT2 x,1


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Fragment Tester: Continued

Play with it! This is one exercise where you need to load the example from the diskette and analyse what it does, because it is not all scripted. For your own example, you could draw different things, and then select them, and move them to the fragment number in which you want them to live. Have another look at Fragment2 in the ‘Advanced 2D’ to remind yourself how it is done, and make one yourself. When you draw different categories of 2D, you can only move one category at a time. For example, to move a drawing containing Lines, Arcs, a Fill and some Text from 1 to 2, you could ‘Select All’. You would have to do a ‘copy to Fragment 2 four times before they all got moved. One tip is to Hide the destination fragment. In this way, as each category of object moves from Fragment 1 to 2, it disappears. When nothing is left, it is all in Fragment 2.

More 2D commands POLY2_A and POLY2_B – are extensions of the POLY2 and POLY2_ statements. Simply, they give you ultimate control over the PEN colours, not just of the lines, but of the Fill and the Background colour to the Fill. It may be my version of AC, but I have never got the BackGround Pen colour to work correctly in POLY2_B, but you can make good use of POLY2_A.

SPLINE2 740:!POLY2_A & B demonstration POLY2_B 9,7,4,10, 0.00,0.00,1, -0.10,0.30,1, 0.10,0.30,1, 0.10,0.40,1, 0.20,0.40,1, 0.20,0.10,1, 0.15,0.10,1, 0.15,0.00,1, 0.00,0.00,1

2D Scripts using CIRCLE2, RECT2 etc will be transparent. If you wish your 2D objects to be opaque, e.g. furniture to show clearly over a textured floor, then you have to get a hold of POLY2_A, and Polyline syntax.

.... and SPLINE2_A are usually the result of autoscripted 2D library objects, and it may take you longer than it is worth to make parametric splines based on typing in coordinates. If it had some equivalent command in 3D, it would be more useful and would be worth researching.

SPLINE2 consists of naming XY locations and the angle through the line passes at that point. Smoothing is done automatically. SPLINE2_A is similar, but adds the extra quality of ‘Bezier’ levers, allowing you to bend or distort the smoothing action.

Master Scripts A

MAJOR BENEFIT for GDL users in ArchiCAD 6.x is the Master Script. Previous to ArchiCAD 6.0, any internal parameters that needed to be calculated (such as the circumference and sweep angle of an arch) had to be done separately in the 2D and 3D scripts – and perhaps in the Properties script too. You might have needed several IF statements to check for bad user parameters. If you subsequently changed or added to these, you had to go to each script, copying and pasting. Now, with Value Lists, there is even more parsing of internal parameters to be done. A sophisticated user tends to define their own Materials, set out manufacturer’s rules and set up Arrays. The Master Script is the right place for such housekeeping tasks. ©Copyright Marmalade 1998, 1999, 2000, 2001

So you can put all this error checking and parameter calculation into the Master Script. GDL executes the Master script early (it reads the Values lists earlier!) and retains all the internal parameters, passing these on to the 2D and 3D scripts as needed. This way, you only have one place to check when you want to modify your error checking routines. You can make the 2D and 3D scripts concentrate solely on their main job. You must never write the END command here – it will obey! So you cannot use subroutines. (A small bug in early releases of AC_6.5 stops objects being stretchy if they have a complex Master Script – if this occurs, move the script to the 3D Script area.) 2.33

The GDL Cookbook 3 – Voyager

Modifying Parameters – 2D Car


E have been used to A and B controlling width and depth, but under AC_6.5, the GDL Object can dictate a new value for these – a valuable feature as A and B control stretchiness and may be the whole basis on which the remainder of the object is dimensioned and built. The PARAMETERS command in the Parameters script can read a VALUES list, and as a result of the user’s choice, change the whole object. This example shows it clearly. In this case the parameters have little crosses next to them because I have gone on to make a UI window and want the parameters to be hidden from the usual settings box.

!2Dimensional Car Symbol !Demonstrate PARAMETERS 12D Executive Script !Hood Length as fraction of ‘A’ IF cartyp='MiniHatch' THEN hl=0.30 IF cartyp='Sedan' THEN hl=0.22 IF cartyp='Jeep' THEN hl=0.26 IF cartyp='Estate' THEN hl=0.22 PEN carpen LINE2 A*0.02,0,A*hl,0 LINE2 A*0.02,B*0.25,A*0.02,-B*0.25 GOSUB 1100:!hotspots GOSUB 1000:!Body ADD2 A*hl,0 IF cartyp='Jeep' THEN MUL2 1.15,1.05 IF cartyp='Estate' THEN MUL2 1.22,1.00 GOSUB 1010:!Glass GOSUB 1020:!Roof hatch DEL TOP END:!-------------

1000:!Body ALL SET FILL carfil PUT 0,0, A*0.01, B*0.45, A/4, B/2, A*0.80, B/2, A*0.99, B*0.45, A,0, A*0.99,-B*0.45, A*0.80,-B/2, A/4, -B/2, A*0.01,-B*0.45, 0,0 POLY2 NSP/2,7, GET(NSP) RETURN 1010:!Glass SET FILL glasfil PUT A*0.00, B*0.20, A*0.03, B*0.45, A*0.49, B*0.45, A*0.55, B*0.44, A*0.61, B*0.40, A*0.63, B*0.15, A*0.63,-B*0.15, A*0.61,-B*0.40, A*0.55,-B*0.44, A*0.49,-B*0.45, A*0.03,-B*0.45, A*0.00,-B*0.20 POLY2 NSP/2,7, GET(NSP) RETURN

IF hl=0.3 THEN PUT A*0.49,-B*0.45 PUT A*0.48,-B*0.35, Note that there A*0.17,-B*0.35, is not a single A*0.07,-B*0.45, Dimension A*0.03,-B*0.45, here: all is A*0.14,-B*0.30, controlled by A*0.13,-B*0.10 POLY2 NSP/2,7, parameters GET(NSP) based on A RETURN

(car length)

1100:!Hotspots and B (car PUT 0,0, width) A*0.01, B*0.45, A/4, B/2, Hotspots use A*0.80, B/2, the same A*0.99, B*0.45, points as the A,0, A*0.99,-B*0.45, Poly-points on A*0.80,-B/2, the body A/4, -B/2, outline A*0.01,-B*0.45, A*hl,0,A*0.02,0 !Hood REPEAT Here are the HOTSPOT2 GET(2) resulting 2D UNTIL NSP=0 symbols, RETURN

whose fill patterns can be tweaked

1020:!Roof hatch SET FILL roofil PUT A*0.13, B*0.10, A*0.14, B*0.30, A*0.03, B*0.45, A*0.07, B*0.45, A*0.17, B*0.35, A*0.48, B*0.35 IF hl=0.3 THEN PUT A*0.49, B*0.45 PUT A*0.55, B*0.44, A*0.61, B*0.40, A*0.52, B*0.30, A*0.53, B*0.10, A*0.53,-B*0.10, A*0.52,-B*0.30, A*0.61,-B*0.40, A*0.55,-B*0.44

Above: Note the extensive use of PUT & GET in the subroutines. This is the first and most important thing to be covered in the Voyager Course. Without PUT & GET no serious complex task can be achieved. Note also: Hotspots are displayed to reveal their ‘body hugging’ quality! !Parameter Script for 2D Car Symbol VALUES 'cartyp' 'MiniHatch', 'Sedan','Jeep', 'Estate' Depending on the IF cartyp='MiniHatch' THEN User’s selection, the PARAMETERS A=3.4,B=1.5 PARAMETERS ENDIF command in this IF cartyp='Sedan' THEN script goes off and PARAMETERS A=4.2,B=1.6 changes the fundaENDIF mental parameters IF cartyp='Jeep' THEN of A and B – thus PARAMETERS A=4.9,B=1.8 ENDIF updating the size and also the IF cartyp='Estate' THEN PARAMETERS A=4.2,B=1.6 Hotspot locations ENDIF correctly.

Right: It is also possible to enjoy the pleasures of a Pictorial Value List


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Programming Concepts

Input / Output How do GDL scripts get information with which to build 3D and 2D objects?



Hard coded parameters: First, many parameters can be ‘hard coded’ in the script. These are not user modifiable. You might want your script to include the tensile and compressive properties of steel or timber, so that sizes in a truss can be checked by a calculation. As these quantities never change there is no point in forcing the user to enter them in the settings.

3D Output: The first result of GDL is the object in 3D. This is the main purpose of using GDL.

User modifiable parameters: When you create an object, you build a list of user modifiable parameters in the main library control window – you have in effect built your own dialog box which controls the object. Parameters can be dimensions and angles, numbers and integers, materials and pens, text or fill patterns, or ON/OFF choices. With the User Interface (6.5 onwards) it is possible to make this process even more sophisticated – prompting the user with pictures and explanatory information.

2D Output: [1] Many objects are solely in the form of 2D, such as grids, or sanitary/hospital fittings/machines etc for layouts where 3D is not required. However, you can also get the 2D to be scripted as carefully as the 3D, so that the 2D symbol can be used to label the object, or even display a warning when something is wrong and needs modifying – such as warning that a beam is unsafe, or a tube is too slender. 2D can also do useful things like displaying the span of a beam that has been stretched to fit between supports, or to print chevrons to indicate the upwards direction in an object that has been tilted.

Calculated Parameters: As the object is stretched, or as a result of some user entered parameters, certain calculations may be made which will change the object. For example, if the slenderness ratio of a steel strut is exceeded, the diameter can be increased.

2D output: [2] The object can also be viewed in section or elevation. this can be saved as a plotmaker file, or as other re-usable forms, such as JPEG. Or if you select the section, Copy it, and paste into the Plan, you have a 2D drawing which can now be grouped, merged, edited, or saved as a DXF. Perhaps you need it in DXF to drive a cutting machine, or simply for sending to your engineer or fabrication shop.

Arrays: The most interesting of the user modifiable settings is that you can offer the user a spreadsheetlike display which they can fill with an array of numbers, which then get used by the script.

Text Output: The GDL script, while executing, can be made to open a text file, write data to it and close. This could be a table or listing of useful data, such as a cutting schedule for a trussed rafter.

Text File input: The GDL Script can read information from a text file placed in the ArchiCAD Data folder. Of course, the script needs to know how the data will be offered. It is equivalent to the READ or the INPUT# commands in BASIC.

Properties/Components/Descriptors: This is another way of printing out listings and is more powerful than the text file, as it can include plans, section/elevations or 3D views of the object for the purpose of creating schedules or databases.

Hotspots: Every object has hotspots, to enable it to be picked up or selected. But Hotspots in the right places can be used to make the object stretchy, or in some cases, the user’s movement of hotspots can change some other characteristic of the object – analogous to a joystick control. Global Variables: The GDL script can request information from the current project such as the current drawing scale, the current pen and material settings, the storey. the most useful application of this idea is in Window/Door design where the window can find out the thickness, materials, radius of curvature and other properties of the Wall which holds the window. REQUEST and REQ: These are similar to GVs in that they can obtain information from the project file. ©Copyright Marmalade 1998, 1999, 2000, 2001

Tips and Tricks: ‘3D View to Symbol’


his command has been lost in ArchiCAD 6. Never mind! If you want a simple 2D Symbol, give the object a 2D script of PROJECT2 3,270,2. Drop the object into the Project Plan. EXPLODE it. Select the Lines in the exploded 2D symbol, Copy them. Open the 2D symbol window, and Paste it. It will be in the right place and scale, and if not adjust it so that it is in the right place relative to the object’s origin. Add some 2D Hotspots. Replace the PROJECT2 command with FRAGMENT2 ALL,1.

Oddity of PUT & GET


lthough you clear the buffer if you GET all the num bers, you can write all your PUTs in the Master script, and they are available to BOTH 2D and 3D scripts. You can GET(NSP) in both without causing an error. 2.35

The GDL Cookbook 3 – Voyager

Programming Concepts

Arrays Arrays – a table of numbers


NYBODY who has programmed in BASIC will welcome the power of Arrays. An ‘array’ is just a row or a table of numbers or strings (alpha characters). Imagine a single row of 16 numbers in a spreadsheet – The whole row can be called ‘pt’.This is a one dimensional array (e.g. DIM pt[16]). The third number in the row is called pt[3] – and so on, and so on, using square brackets. Now just imagine a spreadsheet table of 4 columns and 16 rows (DIM pt[4][16]). This is a 2 dimensional array. These numbers are stored in memory. A statement like LET eavht= pt[4]*1.723 will modify the fourth item in an array. The essential difference between an Array and the PUT & GET system in GDL is that an Array of numbers can be played with – manipulated, sorted, aggregated, swapped, multiplied, used again and again. Note that you can also use arrays to store Strings. If you use strings, you cannot use them with PUT & GET. With PUT & GET, you PUT numbers into a temporary memory buffer, somewhat like a one dimensional array; but you can only get them out in the order they went in, and the moment you GET them out, you have cleared the buffer – it is emptied! Lost! The array can be filled from a series of numbers generated in the script – for example, by a routine that worked out the outline of a curved window. With AC6.x, the script writer can set up a single or 2D array that is visible to the user in the Library settings dialog box, and the user can edit it. When I first read about PUT and GET, I couldn’t think of a use for them. After a few models, one realised that they were an essential aid for everyday use (with prisms, extrude, tube etc.) and one could not manage complicated 3D modelling without them. You may feel the same way about Arrays. Once you get the hang of it, you may wish to use arrays with many of your objects. It must be said before you read on – unless you have a totally confident command of the use of PUT & GET,

do not go any further into the use of arrays until you have mastered these essential commands.

Declaring an Array: with DIM You first declare the size of the array with a DIM command. If the array is to be a single list of 16 numbers called ‘eavht’, and you have another 2 dimensional array with 10 numbers for X, Y, and masks for a floor slab, you would write (early on in the Master or 3D script), DIM eavht[20],xym[16][3]

The idea of writing a few more than the number you want is that it doesn’t do you harm to reserve more memory in case you decide to use more numbers in the future. 2D arrays go in the order [rows][columns] so xym[16][3] is 16 rows of numbers, 3 columns wide.

Using an Array Once the array is filled, you can use the numbers in the array as variables, such as:- ADDz eavht[8], which would lift the cursor to the height of the eighth eaves height in your list, say for placing a gutter. To go to the third point on the floor slab, you could write:ADD xym[3][1],xym[3][2],0

In certain cases, such as with PRINT or PUT, you can dump the entire contents of the array in one go. e.g. PRINT xym, or PUT xym, but I have tried and it will not work directly with PRISM because it doesn’t insert commas. What will work though is:PUT xym !fill buffer with array contents PRISM NSP/3,0.2, GET(NSP) !do it!

Limits to arrays PUT and GET have no limit to the quantity of numbers that you can place – I have tried 1000, 10000, even 100000 without trouble; arrays are declared first with a numerical DIM statement, declaring their size e.g. DIM vx[32]. It is not possible to declare an array with a variable, e.g.: pn=32: DIM vx[pn], in which the quantity in the array results from user input or an earlier calculation. However, it is possible to write it so that the user can edit small arrays from within the Library object settings box. It is very powerful. For anybody with past programming experience with BASIC, it is annoying that GS use their own way of writing arrays, using square brackets. xym(16,3) is pleasanter to read and write than xym[16][3]. Warning: Objects with arrays in the script work fine, any time, but if they have array parameters (as left) they will not work with the GDL Object Web Plugin. Arrays can be 1-dimensional (like this), or can be 2dimensional, like a table of numbers. Arrays can contain strings (alphabetical characters.)


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Arrays in action I

don’t know what this structure is, perhaps it’s a garden structure,but it perfectly exemplifies the use of arrays – when you have a number of X-Y positions which are needed repeatedly for different purposes. Open a new object, make one parameter only for Material matl.

Master Script The list of points here were first generated by making a 2D Fill, dragging it into a 2D script window, then copying and pasting the list of numbers into the Master script. The routine uses PUT to store all the points into memory. Then two arrays are declared – there is one for the X points and one for the Y points. Because the numbers are all stored in memory, nump is easily calculated (the total of points). The FOR... NEXT loop then places all those numbers into the array for permanent storage. The status code of 1 at the end of each line (that came over from the POLY2B) is simply dumped as it is not needed for the 3D object. [By the way, this must be a point to point polygon, not a POLY2_B that uses Polylines like 900 and 4000.]

3D Script On the ground floor, the ADD command uses the array to place the cone columns. Then it uses the same array to draw the floor and roof slabs. Having used GET, the memory buffer is empty, so the buffer is refilled by a quick FOR… NEXT loop that runs through the array PUTting the numbers again. We add a horizontal rail and number each column in the structure.

Arrays with Strings This little string array sends a message to your parrot in the morning – and this is the answer you get!

DIM dncstring[10] dncstring[1]='hello' We fill the array with dncstring[2]='how' some strings, Define a dncstring[3]='are' Style, then concatenate dncstring[4]='you' the strings into one dncstring[5]='today' sentence, and print it out dncstring[6]='my' dncstring[7]='fine' as a text block. The dncstring[8]='feathered' parrot does the same but dncstring[9]='friend' in a random order dncstring[10]='?' DEFINE STYLE 'arrytxt' 'Arial',2,1,0 SET STYLE 'arrytxt' !Write out correct string longstring="" FOR k=1 TO 10 longstring=longstring+dncstring[k]+" " Uses a Random NEXT k number – but TEXT2 0,0,longstring this must be !Write out scrambled string an Integer, longstring="" and must not FOR k=1 TO 10 n=INT(1+RND(9.99)) be zero longstring=longstring+dncstring[n]+" " NEXT k TEXT2 0,-2* 1.1* A_/ 1000,longstring ©Copyright Marmalade 1998, 1999, 2000, 2001

!Array Tester !Master Script PUT 0.0, 0.0, 1, -1.014023, 0.0, 1, -1.978175, -1.018731, 1, -3.000176, -1.018731, 1, -3.000176, 2.992141, 1, -1.978175, 2.992141, 1, -0.973213, 2.180441, 1, 0.52862, 2.180441, 1, 0.52862, 0.813158, 1 DIM x[20],y[20] !Declare nump=NSP/3 !Count FOR k=1 TO nump !Fill x[k]= GET(1) !array y[k]= GET(1) nul = GET(1)!throw away NEXT k

!Array Tester !2D Script HOTSPOT2 0,0 FOR k=1 TO nump PUT x[k],y[k] HOTSPOT2 x[k],y[k] CIRCLE2 x[k], y[k],0.1 NEXT k POLY2 NSP/2,7, GET(NSP)

The 2D script can also use the array – for drawing the outline of the slab, and planting columns and hotspots

!Array Tester !3D Script !Fill the Memory buffer MATERIAL matl FOR k=1 TO nump Whenever you need PUT x[k],y[k] to refill the buffer, NEXT k this is the routine !Build Columns to use RESOL 8 FOR k=1 TO nump ADD x[k],y[k],-0.1 CONE 1.3,0.05,0.10,90,90 ADDz 1.3 CONE 1.3,0.10,0.05,90,90 DEL 2 NEXT k !Floor ADDz -0.1 PRISM NSP/2,0.1, USE(NSP) DEL 1 !Roof ADDz 2.4 PRISM NSP/2,0.1, GET(NSP) DEL 1 !Connecting Beam FOR k=1 TO nump PUT x[k],y[k],1.2,0 The handrail is a NEXT k TUBE command, so FOR k=1 TO 2 an extra two numbers PUT x[k],y[k],1.2,0 are PUT for the NEXT k phantom points. TUBE 2,NSP/4,63, 0,0,901, This routine defines 0.03,360,4001, GET(NSP) the style of the 3D text. Sizing is based !Node numbers RESOL 9 on ACTUAL size DEFINE STYLE 'arrtxt' 'Arial',300,1,0 SET STYLE 'arrtxt' Fill the memory FOR k=1 TO nump buffer again PUT x[k],y[k] NEXT k Now use all those !Print all the numbers points in memory to FOR k=1 TO nump ADD, to get to the ADD x[k],y[k],2.6 right place to plant TEXT 0.2,0,k the numbers DEL 1 NEXT k


The GDL Cookbook 3 – Voyager

GDL Macros M

ANY OF GRAPHISOFT’s Library objects – windows, kitchenware etc – make use of macros. A macro is a script or object that is used to often that it is stored as a special component. An example is a window sash, that could be called from the Library to join a whole variety of window designs. It saves having to write it all out again. The same applies to a kitchen tap – which can be called to a variety of sink unit configurations. AngleRod (in the Voyager Course) could be used as a macro in a cable or spaceframe structure. Macros can be used with the CALL command. They

!Squilinder macro PRISM 4,hit, w/2,w/2, -w/2,w/2, -w/2,-w/2, w/2,-w/2

MATERIAL “whitewash” CALL squilinder PARAMETERS w=12”,hit=2”-10”

may bring their own parameters (that they were first saved with) or may be told to adopt new values in the current script. CALLing the Macro from another script/object Save the left hand routine as an object in its own right with only hit and w as parameters. Now your current script can get it from the library with a CALL command.

Two Golden Rules for organizing your library with macros: • Macros are better as Objects (.ISM files), not as pure scripts – thus they can have their own small parameter names, preview image, 3D and 2D script, which makes it much easier to write and review them because you can see them in 3D as you make them. Keeping the macro within your existing 3D script An even simpler use of the concept of theMacro is to use a subroutine inside a script that can be used again and again, with different parameters being passed to it. The exercise ‘Kitchen Chair’ is an example of this, whereby the conical wood turned elements of the chair are all based on one macro. Here is a tiny example. Supposing you want a Square sectioned solid that always behaved like a Cylinder – that rises axially about the Z axis. I call it a Squilinder.



In this case it is a subroutine, and you just pass parameters to it. To make things smoother, you even apply the name to the subroutine. LET squilinder=100 !..... !..... w=0.3: hit=0.85 GOSUB squilinder ADDx 1.0 GOSUB squilinder DEL 1

100:!Squilinder PRISM 4,hit, w/2,w/2, -w/2,w/2, -w/2,-w/2, w/2,-w/2 RETURN

INARY: is what all Binary converted Library

objects begin with, and either have a value of 3, 2, 1 or 0. There is no use for the command in your creative GDL. Binary objects are not editable (except for the odd MUL or ROT in front of them, and there cannot be parameters for them, except for the MUL or ROTs. ALL: brings an existing library object in, to work as part of your existing object, and you have to opportunity to use the default or new parameters. Whenever you make an Autoscripted library object that involves nesting already-made objects, the CALL command is used. It is not a good idea to use CALL in creative GDL objects. It slows the system down (having to read in from disk) but more importantly runs the risk that if you change the name of the called script or object, or even one of the parameter names of the imported object and then forget to update the new object, the new object will then have a chunk missing. One of the whole points of creative GDL programming is that you can have smart, integrated objects that do not rely on making CALLs. It is better in my mind, to copy and paste the script of the other object into your new object, as a subroutine, and make sure that parameters you wish to use match up with the ones


• It is better that many objects (such as a lot of sink units) should call on a few macros (such as taps); this is more efficient than a few objects calling on many macros (such as a lattice repeatedly calling macros for the members).

you have already set up. Or write a list of parameters at the beginning of the subroutine. It is most useful when you make a range of objects, and some small component is repeated many many times, such as a door handle, or a sink tap; so that a door or a sink unit can call in a handle or a tap script. The CALLed file might not even be a full object in its own right – it may be saved as a GDL Macro, a chunk of pure 3D script which can be read in. Encapsulating: If you wish to use the CALL command, the quickest way to get the scripting correctly written is to view the old object in the Project Plan, select it, Save-Special as a library object and you then get the CALL command perfectly autoscripted for you by ArchiCAD, with all the parameters correctly spelt. Copy and paste that to your new object, and use it as a subroutine. I call this process ‘encapsulating’ the object.

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Maths Primer G

DL requires a 3D spatial awareness, and an essential minimal knowl edge of Triangle and Circle Geometry. Architects usually have no problems with the former, but may need help with the latter. Let us assume that you are familiar with basic Arithmetic and Algebra. As a Voyager, you have a working knowledge of BASIC. However, there are 3D problems which require considerable analysis before you begin, and I find these pages useful for myself when tackling new problems. Sketch onto paper the essential geometry of the problem. Then plan the solution.

Rotation Directions


he Geophysical world works with the vertical north (0°) at the top and east (90°) is in a positive direction clockwise. West is either –90° or +270°, depending on how you travel there. The hands of a clock work that way.

Nostalgia trip Suddenly all those distant memories of Maths you did back at school can be dusted off and made useful. Isn’t it marvellous!!

Which way to ROT?? 90°


In Mathematics, the horizontal is Zero°, and an angle grows in the anti clockwise direction, so that 90° is 270° facing up the page. This is how the diagram for the camera works in 3D Projection Settings, in ArchiCAD. In GDL, You can use angles in either the mathemati180° cal or geophysical sense, as long as you remain consistent in your interpretation. Rotation in the When you talk about the azimuth of the Sun rela- Geophysical world tive to the site and entering site survey information, this causes confusion. But at least, for GDL use, I hope this is clear.


rigonometry made easy: you need a basic knowledge of the right angle triangle – in fact all you need to know is the motto SOH CAH TOA so that you can always calculate the characteristics of a triangle from minimal information. If you don’t know this already, learn it by saying it to yourself as a mantra whilst in traffic queues.


Rotation in the Mathematical world

Remember: ‘SOH CAH TOA’ SIN(angl)=Opposite/Hypoteneuse COS(angl)=Adjacent/Hypoteneuse TAN(angl)=Opposite/Adjacent

Coordinate Geometry is based on Pythagoras. The distance between any two points is simply SQR((x1-x2)^2 + (y1-y2)^2). This works even when points have negative values. The gradient ‘m’ of a line is =(y1-y2)/(x1-x2) – the same as the TAN of its angle. The formula for a straight line is y=mx+c, or ax+by+c=0. If two lines intersect (straight or curved), you can derive a simultaneous equation – both ‘y’ values equal each other. The gradient ‘m1’ of a line equals (-1)/(m2), m2 being the gradient of its perpendicular line – or you can say that m1*m2=(-1).

(The side) Opposite (to the angle)

Right Angle Triangles





ne ote


Hy angl

The Right Angle

(The side) Adjacent (to the angle)

Pythagoras says (many years ago): Hypoteneuse squared equals sum of the squares of the other two sides. In other words, Hypoteneuse=SQR(Adjacent^2 + Opposite^2)

Consult these pages! You are now looking at the set of pages that I use myself most frequently. The maths Tips and Tricks are useful, and some of the formulae for circular and parabolic curves are totally original material. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Irregular Triangles


RREGULAR triangles can be analysed by breaking into small right angled ones and using SOH CAH TOA. The SIN and COS rules will enable you to derive all the facts from any three pieces of information. Powers can be written with two asterisks e.g. num**2, or as num^2 and square root is SQR(num) or num^0.5. Cube and other roots would be written as num^(1/3). Any three points in space, no matter how irregularly disposed can be joined up to form a planar (flat) triangle; a planar circle can be drawn through the points. ArchiCAD’s circle tool provides a means of finding this centre. The calculation is more difficult. An Isosceles triangle has two equal sides and two equal angles. The angles of any triangle add up to 180o.

From this diagram you can work out any triangle from any three known facts b

• • • •

• To generate 1 & zero alternately in a loop (stepping 1) flag=2*FRA(k/2) • To make any number into 1 (if real) or 0 if zero. IF item<>0 THEN flag=item/item ELSE flag=0



!3D Pythagoras Demonstration MODEL wire PEN 1 x=1: y=2: z=3 BLOCK x,y,z !Calculate length of diagonal diaglen= SQR(x^2 + y^2 + z^2) ROTz ATN(y/x) ROTy ACS(z/diaglen) CYLIND diaglen,0.02 DEL 2

z y

x • X=SIN(rotang)*COS(elvang)*diaglen • Y=COS(rotang)*COS(elvang)*diaglen • Z=SIN(elvang)*diaglen

• OU frequently need to ‘toggle’ or convert numbers and • flags especially when Boolean choices are involved. • To find out if a number is odd or even :• IF INT(item/2)=item/2 THEN even=1 ELSE even=0 • or IF item MOD 2=0 (it is even) To find out if number is Negative or Positive (& set a flag): • IF item<>0 THEN flag=item/ABS(item) ELSE flag=0 • (makes 1 or -1, or 0 if item is zero) • To force a number to be positive: item=ABS(item) • To force a number to be nearest even number item=2*INT(1+item/2) •


side c

A circle can always be inscribed in an irregular triangle. From this, several right angle triangles can be derived. SIN Rule: a/SIN(A)=b/SIN(B)=c/SIN(C)=2*R COS Rule: a^2= b^2 + c^2 – 2*b*c*COS(A) Hence, if you know the sides, Angle A=ACS((b^2+c^2-a^2)/(2*b*c)) Area=(length of any side)*(height relative to that side)/2


Tips and Tricks – Maths bits

a R

angle A

3D Pythagoras NE FACT that I worked out for myself, but must be in a book somewhere, and which I have used for some time, is Pythagoras’ Theorem applied to 3D. The diagonal of a cuboid shape is the Square Root of the sum of the squares of the Length, Width and Height. diaglen=SQR(x**2 + y**2 + z**2) [can also be written as SQR(x^2+y^2+z^2) ] The script here demonstrates it fully. Thus if you have a linear object arcing around in 3D space (like the arm of a crane) you know its length and its declination angle from the simple formulae demonstrated here. (Declination is the elevational angle from vertical). From this theorem, you can work out the reverse of the 3D Pythagoras, using Trig. If you know the crane arm's length, its Rotational angle, and its Elevational angle (from horizontal), you can know its X,Y,Z location in space. In the diagram, ‘rotang’ is the rotational angle of the arm from the Y axis, and elvang’ is the elevational angle from flat on the floor. ‘clen’ is the length of the Cylinder. Hence,


To turn 1 & 2 into 0 & 1 To turn 1 & 2 into -1 & +1 To turn 0 & 1 into -1 & +1 To turn 0 & 1 into +1 & -1 To toggle values of -1 & +1 To generate 1 or 0 randomly To toggle values of 0 & 1 To make 0=0, and 1,2,3 etc=1 To make 1 & -1 into 0 & 1 To make -1 & 1 into 0 & 1

(item-1) (item-1)*2-1 item*2-1 (item*2-1)*(-1) item*(-1) INT(RND(2)) (1–item) INT(x/(x-0.1)) -(item-1)/2 (item+1)/2

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager



HERE will be many situations where the object you are making is circular (curved truss), or parts of it trace a circular path through space (a swinging arm). In coordinate geometry, the Formula for a Circle is R^2=x^2 + y^2.

All triangles can be drawn into a circle. It is useful to know that in a right angle triangle, the hypoteneuse is also the diameter of an enclosing circle, and its half way point is the Circle centre.

If you are starting from the vertical, moving clockwise

If you are starting from the horizontal, moving anticlockwise

Polar to Cartesian conversion The diagram displays the terminology of parts of circles used in many of the worksheets in the CookBook.

If you are distributing things in a circle (e.g. mullions in a bay window), you usually know the centre, the radius and the angle in which you are pointing.


If your origin is at the centre-base of this chord, the locations for x and y at angle k from the vertical are: x=rad*SIN(k), y=(B-rad)+rad*COS(k).

Above: You may know the X and Y location, but need to know the Radius and Angle – perhaps you have a diagonal cylindrical tube which must connect the two points. Only works if 0,0 is the centre.

Above: On many occasions, you need to derive the factors of Circles and their inscribed triangles when you only know the CHORD length and the BULGE (segment height).

These formulae above can be juggled about. If you already know Radius and A then: angl=ASN((A/2)/radius) In which case, B, the Bulge can be found: B=(A/2)/TAN(90-angl/2) OR B=rad-rad*SIN(angl)

If you know Bulg and angl, then radius is found: rad=B/(1-SIN(angl) Distance along an Arc whose angle is angl: dist=2 * PI * rad * angl/360 Distance between points whose angular separation is angl and radial distance is rad =2*rad*SIN(angl/2)

If you know rad and angl, the height of the Bulge is

©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Arch Forms


have developed formulae which can be used for raised arches or hanging cables. (See the ‘Arches and Waves’ exercise in Voyager). The parabola is the perfect form to display the effect of gravity on a linear pathway. An arch or cable with self weight describes a Parabola distorted into a Catenary, which is based on hyperbolic trig (COSH & SINH) and cannot be covered in this edition. The formulae below describe several way sof building arches and forms using mathematical curves.

A true Parabolic arch is more elegant than a SIN or circle. It is close enough to a Caternary for almost any GDL purposes.

Flattish Round Arch

SIN Wave Arch

(less than 180 degrees of sweep): radius=(span/2)/SIN(2*(90-ATN((span/2)/height))) Z=radius*COS(ASN(x/radius))-(radius-height) (Circles and ellipses are much better done by a radial method. For an ellipse, you can use the above, but add, LET Z =Z*height/(span/2)). The cartesian formula for a Circle is R2=x2+y2 so you can use y=SQR(R*2 -x*2) for short circular forms.


Gothic Arch For each side, you can run a profile of the doorway with REVOLVE and use a Cutplane to cut it at the vertical axial centre. Or by using TUBE you can do it in one sequence. angl=(90-ATN(height/(span/2)))*2 radius= height/SIN(angl)

Parabolic Arch Z=height–(4*height/(span^2))*X^2 dydx=(8*height/(span^2))*X (‘dydx’ is TAN of the slope at point X – if you want to attach panels.) For this, you start a FOR…NEXT loop starting from span/2 one side of zero and finish up span/2 the other side of zero – using PUT to store all the XYZ values. Then feed them to a TUBE command or to whatever you are building. Inversely, X=SQR((hit-Z) / (4*hit/(span^2))) works in the Z direction but you get an over flow if you go close to the peak of the parabola.

Elliptical Arch ... is done by applying MULz to a Circular arch, but this may distort the section of the tubing. Use REVOLVE or ELBOW to draw the arch. If you are doing a ‘Swing the Cat!’, you can multiply the vertical direction by a factor, to achieve the same effect and avoid distortion of the section.

Swing the Cat!:This technique is explained in some exercises (e.g. Long Handrail, Helix). Trace out a circular path, store them and then send the list of points to a TUBE. If you use SWEEP, the path has to start from 0,0,0 which may affect some of your arch calculations.

Ways of avoiding Trigonometry

Points to remember:

Using the TUBE or the SWEEP command, it is possible to link two XYZ locations with a cylinder without needing to know the angle and length. If you are distributing objects in a circle – like mullions in a curved window – you may not need to do a polar to cartesian conversion. Just keep swivelling the cursor, and push out an object, delete back, then swivel to the next location. e.g.

• PI (π) exists as an constant in GDL. Useful... • There are 360 degrees in a circle. But you can safely issue commands like SIN(angl) when angl is a number like 535º (greater than 360) and GDL will not turn a hair (it will return a result of SIN(175)). • A circle’s circumference is 2*PI*R, or PI*diameter • You can make Ellipses by using the MUL command to shrink or stretch Circular forms into ellipses. Besides the matter of geometry, you need to know some of the arithmetical functions offered by GDL, such as ABS( ) and INT( ), MAX( ) and MIN( ), MOD and FRA( ).

ROTz ang: ADDy R: GOSUB 250: DEL 2

This will make sense when you try an exercise (eg the CircleGrid or the Tempietto).

If you are handy at deriving things from first principles and thinking logically, all you need really is Pythagoras and SOH CAH TOA ! 2.42

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

The Binary System – for Voyagers Only read this if you want to...


F you are a GDL beginner, or if your eyes glaze over at maths, do not bother with this page right yet. Come back to it, when you are trying to understand ‘status codes’ and ‘masking values’. Binary is the key to understanding how to use the Status and Masking values. It’s the way that all computers work actually, but low level programming code converts decimal numbers to binary without our knowing or needing to know how it does it.

Binary is a numbering system based on 2, rather than ten, which is what we use in normal life – because we were born with ten fingers. With decimal, we have to develop a notation for all the numbers between 0 and ten, hence 1,2,3,4 etc. With Binary, you have a simple choice – 0 or 1. Binary is quite efficient at dealing with CHOICES – which could be simplified down to YES or NO situations. Do you draw a LINE? If yes, it’s *zero* if no, then it’s *one*. That is how status codes work in 2D entities in GDL. If the base is 2, then to write a number in Binary, you use a series of 1 and 0’s . For example, the number 3, being the sum of 2+1 is written as 11. The number 9 is made up of 8+ 0+ 0+ 1, so it is written as 1001. 147 is 128+ 0+ 0+ 16+ 0+ 0+ 2+ 1, so it is 10010011.

Using Binary to choose Status Values – 0 to 1 IN 2D GDL, you only need to decide whether a line is to be drawn or not. Therefore there is a simple choice, Yes or No. In the example here, Status codes have been used to define whether lines are to be drawn or not. Zero (0) means draw the line, and one (1) means do not draw it. Even when mixed with Polyline commands such as 900 and 1000, you ADD one or zero to achieve the same effect.

Using Binary for Masking Values in Prisms – 0 to 15 IN 3D Prisms, you need not only to know if lines are to be drawn, but if surfaces are to be visible. This has 16 possibilities – from 0 to 15. Here is a table of all the numbers up to 16 so you can see how they are made; these cover all the masking values for the sides of PRISMs. In this case, [1] means do the action, and [zero] means do not. So 8 means draw the face, 4 means draw the top line, 2 means draw the side line, and 1 means draw the bottom line. Any combination of these can be expressed with a number from 0 to 15. It is puzzling that with Status values for profiles in Extrude and Tube, zero means draw the line, but with Masks, the opposite applies. Graphisoft! – why??

420:!POLY_ Demo with hole !Syntax:- POLY_ number, ! x1,y1,mask, ! x2,y2,mask, etc POLY_ 9+2, 0.00,0.00,1, -0.10,0.30,1, 0.10,0.30,0, 0.10,0.40,1, 0.20,0.40,1, 0.20,0.10,1001, 0.15,0.10,0, 0.15,0.00,1, 0.00,0.00,-1, 0.05,0.1,900, 0.05,360,4000

In this example we want to miss out the edges that lie parallel to the Y axis. So place a zero as the status code for that line. -1 is a way of saying ‘finished’. It does not control line drawing.

ArchiCAD Training

Make a black Pen!


If you have a pen colour of zero, you could get an error! (In AC65 onwards, pen 1 seems to be adopted.) One way to avoid this is to use REQ to force a pen colour to exist. e.g. if you have a Pen color parameter called ‘ink’: IF ink=0 THEN ink=REQ(‘Pen_of_RGB 0 0 0’) PEN ink will build a pen colour from the RGB components of zero, zero and zero, i.e. black. As the rgb components have to be within the quotes, you cannot use parameters, only numbers. You cannot use commas to separate them.

o matter how long one has been driving, or parenting, or architecting (for that matter) there is always something useful one can learn from others – no matter whether they are equals, experts, or newcomers with open eyes. The fact that you are reading the Cookbook proves that you are not the sort of person who says ‘I know as much about ArchiCAD as I need to know.’ Training courses (in whatever aspect of ArchiCAD) may seem expensive, but often they are the kick you need to get up to the next level of skill or problem solving technique. Take courses! ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager




Masking codes 0-7

1 2+0 2+1 4+0+0 4+0+1 4+2+0 4+2+1 8+0+0+0 8+0+0+1 8+0+2+0 8+0+2+1 8+4+0+0 8+4+0+1 8+4+2+0 8+4+2+1

1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15


OLY2_ in 2D scripting uses a binary group of three choices, draw the Line (1), draw the Fill (2), and Close the polygon (4). Therefore the range of decimal numbers is from 0 to 7. WALLHOLE also uses 7.

Masking codes up to 127




16+0+0+0+0 16+8+0+2+1 32+ 0 +8+0+0+1 32+ 0 +8+0+2+1 32+16+0+0+0+1 32+16+8+4+0+0 32+16+8+4+2+1 64 or 127-63 64+ 0 +16+0+4+0+1 64+32+16+8+4+2+1

10000 11011 101001 101011 110001 111100 111111 1000000 1010101 1111111

16 27 39 43 49 60 63 all on 64 85 127 all on

USING the same principle, you can now analyse how the masking values work, up to 127. These are used by EXTRUDE, PYRAMID, REVOLVE, RULED, SWEEP, TUBE, MESH, MASS and COONS. If you use 127 or 63, you cover almost all eventualities, but you may find this table helpful to understand how to achieve results. By the way, each of the 3D forms mentioned here use masking values slightly differently, so you still need to check the manual in each case. Analytical combinations can be done by subtraction as well as addition. For example, ‘127-2’ is a convenient way to say ‘draw everything except the top surface’. Some people use numbers up to 255, but as things stand, it is clear from the manual that 127 is the highest number necessary.

Obscure Commands


HE GDL Cookbook does not cover ARMC and ARME at the moment, as their use is very rare. In most tubular assemblies, one can allow Cylinders to flow into each other. I guess that ARMC and ARME must be the last remains of the RaDar piping design software that was the birth of ArchiCAD.

Tips and Tricks Dynamic Line numbers! Normally you GOSUB 100 and that’s it. But if you are making use of flags, you can use this technique. Where you might normally write: IF hs=1 THEN GOSUB 101 IF hs=2 THEN GOSUB 102 IF hs=3 THEN GOSUB 103

You can write all of these on a much shorter line: GOSUB 100+hs

The trick of course only works if you organise your subroutines so that the numbering relates to the flag numbers. If you (like me) prefer to follow good practice and separate your line numbers in chunks of ten or more, then replace: IF hs=1 THEN GOSUB 110 IF hs=2 THEN GOSUB 120 IF hs=3 THEN GOSUB 130

with: GOSUB 100+hs*10

Advertising Feature


S there is some white space left, here is my opportu nity for a Plug! Many of you will get this book with ambitious ideas to learn it all, but as the old adage goes, ‘Practice makes perfect’. Most of you are busy architects with jobs to do and regard GDL as something you are curious about, but will never have the time, or the opportunity to plumb to its depths. Because I work for other architects, and also have students to train (some of whom become very very good at GDL), I have a constant incentive to keep working at it. I get many of my ideas for techniques and tips and tricks from architects who phone or fax me with requests. An architect can fax me a hand sketch of something that is needed, I can quote a ‘diffi2.44

culty index’ or price by email, and it can then be done within a day or two and either emailed by internet, or mailed on a disk. Your name and perhaps the object itself might appear in a future edition of the Cookbook! My charges are very reasonable in that I charge much less if the object being made is an investment – that can be used again and again. All my objects for architect clients have a very high threshold of quality – error checking, stretchiness, parametric flexibility, 2D scripted quality etc. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Ridge & Hiptool T

HIS is a useful item to put on your buildings, to give them added authenticity. You have to use the Section view to nudge them into final position. PEN L_ and MATERIAL M_ is a useful way to enable someone to use the library object setting box – Pen and Material are forced to be as specified by the user – thus reducing the amount of clutter in the parameter settings. Once in the Project plan, it adopts the material setting given to it. If your model contains several components and materials, then it’s preferable to use the normal parameters box. While developing your model, it may have the unfortunate appearance of being green, so you could put in a temporary MATERIAL 18 command (whitewash). The idea of highlighting the 2D symbol with a pair of long arrows is to make sure that you have remembered all the ridges and hips, and to make it easier to pick them up in plan (gives you more hotspots). As it can cause visual clutter in the plan, there should be a Boolean choice to be turned off.

!Values List _ parameter script VALUES 'shape' 'Base on Angle', 'Base on Height'

!Ridge and Hip tile !3D Script MATERIAL M_ PEN L_ IF shape='Base on Angle' THEN len=A/COS(pitch) ENDIF IF shape='Base on Height' THEN pitch = ATN(hit/A) len = A/COS(pitch) ENDIF ROTz 90 ROTx 90-pitch RESOL 10 BODY -1 EXTRUDE 4,0,0,len,55, rad, 0, 1, 0, 0, 901, rad, 180, 4001, 0, 0, 1 BODY -1 DEL 2 !Ridge and Hip tile !2D Script PEN L_ HOTSPOT2 0,0 HOTSPOT2 A/2,0 HOTSPOT2 A,0 PROJECT2 3,270,2 IF higl THEN HOTSPOT2 A/2, 0.5 HOTSPOT2 A/2,-0.5 LINE2 0,0, A/2, 0.5 LINE2 0,0, A/2,-0.5 LINE2 A/2, 0.5, A,0 LINE2 A/2,-0.5, A,0 ENDIF

Use a Value list to decide between using the Ridge by naming a Pitch or a final Height. It’s more user friendly than a Boolean choice.

The 2D symbol can be highlighted with large arrow shapes so that you can pick it up

AngleRod – Useful stretchy tool object with TUBE A NGLEROD

is a prime example of a STRETCHY object which is more properly a TOOL. It is similar to the Ridge/hip tool previously described. AngleRod is most useful for building up anything tubular – by placing the object in the project window, stretching it to its endpoint, and then defining height.

Parameters Stretchy objects are made by using A and B as the defining dimensions – most useful for railings, cornices, kerbs, special walls, beams. Once you have used this, you will always try to make your objects stretchy. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

3D Script The 3D Script uses the TUBE command – this requires that you specify a ‘phantom’ location above and below the real tube start and end points. By using the A and B dimensions to define these, you get cleanly cut butt ends to the cylinders. The routine 0,0,901, followed by cdiam/2,360,4001 is the standard routine for defining a circular section in an extrude, revolve, tube or in several other commands. You might as well get used to it.

!AngleRod !3D Script MATERIAL cmat PEN L_ RESOL rsl TUBE 2,4,63, 0,0,901, cdiam/2,360,4001, -A,-B,-z1,0, 0,0,0,0, A,B,z1,0, 2*A,2*B,2*z1,0

It is important to allow user control over the Resolution. The anglerod could be used for fine cables (use resol 3) or the giant sections for a The key to stretchy objects is to place the bridge or pier. Hotspots in the 2D script. Hotspot2 0,0, Notice that with the Tube command, you get linear lines along the and A,B. cylinder. By changing the 900 and 4000 commands to 901 and As a complex group of tubes could 4001, the lines are cleared. have end and bounding box hotspots which would interfere with each other, !AngleRod you should plant Hotspots along the line !2D Script of the tube, so you can be sure which one HOTSPOT2 0,0 HOTSPOT2 A*0.25,B*0.25 you have grasped. HOTSPOT2 A*0.50,B*0.50 You can get rid of the bounding box HOTSPOT2 A*0.75,B*0.75 HOTSPOT2 A,B by placing a 2D hotspot at the origin in PROJECT2 3,270,2 the 2D Symbol window – then turning off bounding boxes in the main library box.

2D Script

2D Script: Plant Hotspots along the line of the tube. Specify Hotspots before you issue the Project2 command.

Use it as a Component or as a Macro! By combining AngleRod into tetra-hedral groups, and by grouping the groups in encapsulated library objects, you can assemble complex tubular and cable/strut structures without any need to use GDL or trigonometry!

!Extension to 3D Script IF endshape='Rounded Ends' THEN SPHERE cdiam/2 ADD A,B,z1 SPHERE cdiam/2 DEL 1 ENDIF

Using AngleRod: When you enter the anglerod into the plan, it’s best to have the stretchy box selected in the control box. If you dont, you have to place it first, and then stretch it later.

This is what it looks like as it is being stretched. One rod Value List: By adding an extra parameter to choose Butt ends or on its own doesn’t Rounded ends, you can add a Sphere at each end of the Tube, giving a look very exciting, rounded end. Put this in the Value List. Round ends will add hundreds or but the rods can be combined to thousands of polygons to your model – Beware! create complex frameworks. VALUES 'endshape' 'Rounded Ends', 'Butt Ends'


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Stair – Parametric This exercise demonstrates of the use of: • The PUT statement in a FOR NEXT loop. • PRISM using GET • CYLIND, TUBE & Polylines for the Handrail • Using Pythagoras and ArcTan to work out the details


NE of the problems with any object •stepping• like a staircase is how to make the number of steps as a parametric quantity. First, you could make each step a separate object, and use a loop to draw them. But this would be ugly with many surplus lines. It is better programming to do the stair as one object, and thus ensure a smooth soffit to the underside with faster rendering. You can make most Staircases with Stairmaker, but how much more fun it is to make your own, and with a greater degree of control. The technique used in this example is used later in the Theatre seating and other stepping objects.

The Result The Stair can be any number of risers, any riser height or going! You can opt to have handrails or none, on the left or the right side, or on both!!

Parameters First put in the parameters that affect the stair itself. Leave all the handrail questions till later. The stair will be stretchy in width, so use A. The stair risers will be slightly raked – the user can decide on the size of ‘rak’.

3D Script As is common with the Cookbook ethic, a very structured approach is used, whereby the executive script is as SHORT as possible, with most of the workload delegated to the subroutines. The majority of shapes used in GDL can be done with PRISM commands. These always rise up the Zaxis. You have to lay out the PRISM on the X-Y plane, and up it rises. On some paper, draw an X-Y diagram like this. To make it the right way up, it will have to rotate it 90 degrees around Y. • First, if you do it NON parametrically, you get the ‘Bad Stair’ 100: – in which the treads and risers have been individually dimensioned, and no parametric possibility is offered.

Sketch out on paper how you want to build up the PRISM shape. This method keeps the stair in the positive X and positive Y quadrant. It also helps you decide how to treat the top and bottom step details. ©Copyright Marmalade 1998, 1999, 2000, 2001

!Stair parametric – 3D Script MATERIAL matl: PEN pcol LET width=A !make it stretchy !GOSUB 100: !Stair non parametric GOSUB 200: !Stair parametric !Left handrail IF hrstyl=1 or hrstyl=3 THEN GOSUB 300 !Right handrail IF hrstyl=2 or hrstyl=3 THEN GOSUB 400 END !_______________________

The Handrails will be done on the next page


The GDL Cookbook 3 – Voyager

• Second, you can now try the ‘Good Stair’ 200: – in which you store all the points in the prism in a PUT buffer first – allowing you parametric freedom in the number of risers that the staircase will have. In the ‘Good Stair’ routine, the loop follows its way round the prism shape. This series of PUT & GET statements replace the long list of dimensions in the ‘Bad stair’ with a perfectly parametric solution. Once you have used PUT and GET to establish the fixed XY locations of each end, the intermediate treads and risers are part of a For Next Loop. The GET command: If you want a number of items from the buffer, you write GET(4) if you want 4, GET(12) if you want 12 etc. You can GET the entire buffer by defining NSP as the quantity; you get what the PRISM command requires – a set of numbers, separated by commas. As the numbers are extracted, the commas are inserted by the GET procedure. The PRISM requires 2 numbers on every line, so the number of points in the prism is NSP/2

Tips and Tricks Section fill ArchiCAD 6.5 allows you to define how the objects will appear in section – previously you had no control. So if you make a parameter for Section Fill, you can have a SECT_FILL statement, including parameters for the fill name and three pen types. This only works if the Object settings are set to ‘Use Symbol Section Attributes’.

Handrails The user needs to enter their choice of handrail configuration. To show you two different methods of doing it, the left has been done with a TUBE, and the right has been done with a CYLIND and some Trig. In reality, use one method or the other, and use the MULx -1 command to draw it other side. First make a Value List offering the user some choice in the configuration. Then use the Master Script to read the Value List and turn it into numbers (flags). You can write the Value list in the Parameter Script or you can write it in the Master Script just above the lines which turn the result into flags.

Handrail with TUBE Command SUBROUTINE 300 uses the TUBE command. People find TUBE hard to learn, but it is very rewarding. Tube Section: The cross section is determined by two Polyline commands, one to set the centre of the circle, and the other to describe a circle around it. Radius is half the diameter, 360 is the sweep angle, and 4000 tells it to draw the circle. The extra one [1] on the end makes the rail smooth – to avoid the longitudinal lines you may get along the handrail. 2.48

!*WARNING* – do not bother typing !subroutine 100 – it's here as !an example of inefficient !programming – Use subroutine 200 100: !Bad Stair, Nine Risers ADDx width/2 First, the ROTy -90 BAD stair PRISM 22,width, 0.0,0.00, You can knock up 0.0,0.25, a quick and dirty 1.6,2.25, 1.8,2.25, stair like this by 1.8,2.00, 1.6,2.00, 1.6,1.75, 1.4,1.75, doing it in 1.4,1.50, 1.2,1.50, ArchiCAD’s Project 1.2,1.25, 1.0,1.25, plan using Slab 1.0,1.00, 0.8,1.00, 0.8,0.75, 0.6,0.75, tool, then bring it 0.6,0.50, 0.4,0.50, into GDL to tidy it 0.4,0.25, 0.2,0.25, up. But it would be 0.2,0.0, 0.0,0.00 DEL 2 non parametric! RETURN !----------------200:!Parametric Stair ! using PUT&GET ! Using square or raked risers ADDx width/2 ROTy -90 PUT 0,0 PUT 0,going PUT (numrisr-1)*riser, numrisr*going FOR N=numrisr to 1 step -1 PUT N*riser, N*going PUT N*riser, (N-1)*going-rak NEXT N PUT 0,0

Observe how economical the PUT and GET routine is.

!Now draw the Stair PRISM nsp/2,width, GET(nsp) DEL 2 RETURN !----------------!Stair: Parameter Script VALUES 'hrconf' 'No handrail', 'Left handrail only', 'Right handrail only', 'Both handrails'

!Stair: Master Script LET width=A !make it stretchy IF hrconf='No handrail' THEN hrstyl=0 IF hrconf='Left handrail only' THEN hrstyl=1 IF hrconf='Right handrail only' THEN hrstyl=2 IF hrconf='Both handrails' THEN hrstyl=3

Hotspots No Show?


e welcome the availability of 3D Hotspots. These can be planted at the end of furniture legs, or in places where it would be difficult to place them in the 2D script. They make it easier to pick up objects in 3D view. Unfortunately, these cannot be seen in the 2D symbol (not even in PROJECT2) and cannot even be seen in the GDL 3D view. Only in the 3D window in the ArchiCAD environment can they be seen. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Tube Path: TUBE goes from XYZ location to XYZ location, so there is no need for Trigonometric calculations. The Tube must overshoot at each end by one node. So a two point TUBE needs 4 defined XYZ locations. The start and end locations serve to define the mitring of each end, so a small overshoot of one centimetre is used. Make sure that they go in the right direction to get the mitring to work correctly.

Handrail with CYLIND command Subroutine 400 uses CYLIND. This is easier to do, but requires Pythagoras to work out the length, and ArcTan to work out the angle of the rail. Getting it right: depends on the real requirements of the Handrail design – do you need balusters, do you need the tubing to turn at each end, or what? This may determine your choice of TUBE or CYLIND.

2D Script IT IS possible to write a fully parametric 2D script for this object, but if the redraw time is not unacceptable, it can be left as a PROJECT2. However, even with Project2, you should use the script to place HOTSPOTs at the key positions – makes it easier to pick up. You can also add an arrow to the 2D symbol, to indicate direction. The 2D script that DEFINEs a style is there so that you can offer an option for the 2D symbol to display its pitch to the user, and when the pitch is correct, the user can turn that feature off. The Font is autosized to be the height of one going of the stair.

300: !Left Handrail – TUBE startht=hrht+riser endht =(numrisr+1)*riser+hrht d=0.01 !one cm overshoot ADDx width/2-hrdiam/2 MATERIAL hrmatl RESOL 12 TUBE 2,4,63, 0,0,901, !Sets Circle centre hrdiam/2,360,4000+1, 0,-d,startht-d,0, 0, 0,startht,0, 0,numrisr*going, endht, 0, 0,numrisr*going+d,endht+d,0 DEL 1 RETURN !----------------400: !Right H’rail – CYLIND !This requires Trigonometry startht =hrht+riser hgoing =numrisr*going hriser =numrisr*riser hrailen =SQR(hgoing^2+hriser^2) hrailang =ATN(hriser/hgoing) ADDx -width/2+hrdiam/2 ADDz startht ROTx -90+hrailang MATERIAL hrmatl RESOL 12 CYLIND hrailen,hrdiam/2 DEL 3 RETURN !---------------

!2D script for Stair HOTSPOT2 0,0 HOTSPOT2 0,leng HOTSPOT2 -A/2,0 HOTSPOT2 A/2,0 PEN pcol PROJECT2 3,270,2 leng = numrisr*going pitc = ATN(riser/going) LINE2 0,0,0,leng LINE2 0,leng,-A/2,leng-A/2 LINE2 0,leng, A/2,leng-A/2 IF shodata THEN fontz=going*1000/A_ DEFINE STYLE 'show' Arial, fontz,4,0 SET STYLE 'show' ROT2 90 TEXT2 0,0,STR(pitc,4,2) ENDIF

Theatre in the Round Seating This exercise is an interesting demonstration of: • REVOLVE with a parametric profile • PUT and GET statement • Using a parametric offset in the REVOLVE command • Planning the location of the object and the origin


ou could make curved Theatre seating by making each step a separate object (as a piece of slab in plan), and use Multiply and Elevate to draw them. What hard work! This piece of GDL is a continuation of the Staircase example, just done, but curving in plan. The XY locations in the Staircase were sent to a PRISM command – a similar technique is now used to send the ©Copyright Marmalade 1998, 1999, 2000, 2001

same list of points, the sectional outline of the seating/ steps to a REVOLVE command. If you do the bank of seats as one REVOLVE object, you will ensure a smooth curved soffit to the underside. As with the staircase, the problem is how to make the number of steps as a parametric quantity. 2.49

The GDL Cookbook 3 – Voyager

Parameters The Bank of seating can be any number of seats, any height or going, any radius of curvature and any sweep angle! You can opt to have side staircases or none, on the left or the right side, or on both!! This is important if you are planning to join them together to make larger assemblies. The seating banks do not contain actual seats – like plastic flip up seats – but that may the the subject of a future variation on the model. It is important to have a ‘curviness factor’, because the usual default curve resolution of 36 on such a small sweep angle will make the model look too polygonal. Be warned that making it more curvy will add more polygons. You have to balance smoothness with rendering speed! When you offer your user two choices, you can use the Boolian command, but for more complex require- The result – The Nudist convention meets in Epidaurus! ments, an integer number has to be given, as in stair style, or you make a Value list, stating in simple language what alternatives are available. The steps at the side sit correctly relative to the seats. On the underside, there is a perfectly smooth soffit – because the location of the points for the underside are defined by the same subroutine.

Draw it out first!

Use PUT and GET

As with the Staircase, draw out A structured approach is employed, whereby the pro- the shape as if you were to gram is as SHORT as possible, with most of the work- make it with a PRISM command – these always rise up the Zload delegated to the subroutines. axis. Draw it first. If you build it with REVOLVE commands using real dimensional data, it will work, but will be non-parametric. If you use a PUT GET routine first, like the one in the Staircase example, you can modify this as freely as the staircase. Because of the curvy shape, it’s not worth trying to make it stretchy – just ensure that by the parameters, it is quite clear how the stair should be configured. The REVOLVE command spins the object around the X-Axis, so one has to be careful how one lays out the prismatic outline. It is done on an X-Y diagram like this. The example shown appears not just to spin around the X-axis, but to touch it. It is a lot easier to work this way, and to apply a parametric OFFSET, here called 'cent’. So design it according to this diagram.

3D Script

A variety of seating and stair making arrangements is required.


This doesn’t have to be used in a Greek theatre – this object can be used in an ultra modern stadium, and this curved structure could be set into a steel frame (as one of my students has done) and then tweaked with the parameters to fit. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

The Seats and the Stair use virtually the same subroutine – before calling the subroutine, you prime the program with the values of the variables that will produce either a seat or a stair – ‘num’, ‘ris’ and ‘gon’. In addition, we add the ‘f’ flag, to tell the subroutine which structure it is building – stair or seating? All these ‘alphangl’ rotations are very important to ensure that the Origin stays at the front row of seats – and that the axis of symmetry of the seats remains down the centre. If you had the origin of the model at the centre of Rotation of the seats and stairs, you would have an easier time programming it; but the user would have a nightmare – everytime they changed the parameters, the whole assembly would jump backwards or forwards, because the origin would be 10s or 100s of metres away. Looking at the Staircase (previous exercise), one had to feed in the location of the starting points of the stair, followed by the repetition of the x,y coordinates for the stairs themselves. We do the same here. But there is a small difference – the REVOLVE requires a small status code after each XY location – to indicate how lines of the stairs should be drawn. Using 0 (zero) will ensure that the lines do get drawn.

PUT & GET: and ‘flags’ PUT&GET were explained in the Staircase example. A difference here is that the same subroutine 400: is used for the seating as for the staircase even though there are a different number of stairs and seats. Another complication is that you must bring the stair forward the length of a step so that the junction of the stairs and the seats is correct. Thus one cannot follow exactly the same algorithm and simply change the riser and going. Here I use the idea of ‘flags’ which the subroutine checks to see what the current setting is. The flag is called ‘f’ which can be ‘0’ when drawing the seats and ‘1’ when drawing the stair. A flag can also be used as a factor. If you multiply something by ‘0’, you get zero. Thus, by subtracting an amount equal to the distance of the Risers from the centre which is multiplied by ‘f’, you finish up with the correct location. Type it in, try it with and without and you will see how it works.

2D Script You need a Project2, but you also need a bit of tricky thinking to work out the location of Hotspots – needed to help you pick the object up. You could borrow the script from the Staircase which prints out the pitch (angle) and have it displayed on the 2D symbol so that you can tweak the seating to fit a steel frame. !2D script – Theatre Seating

©Copyright Marmalade 1998, 1999, 2000, 2001

IF rs<36 THEN rs=36 RESOL rs: MATERIAL matl: PEN pcol GOSUB 100 !seats parametric IF sstyl=1 or sstyl=3 THEN !Left Stair GOSUB 200 !stairs one side ENDIF IF sstyl=2 or sstyl=3 THEN !Right Stair MULx -1 GOSUB 200 !stairs other side DEL 1 ENDIF END !_____________________________ 100: !Parametric Seats !using PUT & GET ADDy -cent ROTz -alphangl/2 ROTy -90 num=numrisr: rak=ABS(rak) ris=srisrht:gon=stgoing: f=0 GOSUB 400 !PUT all the values !Now draw the seats REVOLVE nsp/3,alphangl,63, GET(nsp) DEL 3 RETURN !-------------------------

200: !Draw the stairs ADDy -cent ROTz +alphangl/2+stangl/2 ADDy +cent GOSUB 300 DEL 3 RETURN 300: !Parametric Stairs !using PUT & GET num=numrisr*2: ris=srisrht/2 gon=stgoing/2 f=1 !'f'=stepsflag GOSUB 400 !PUT all values !Now draw the stair ADDy -cent ROTz -stangl/2 ROTy -90 REVOLVE nsp/3,stangl,63, GET(nsp) !Do it!! DEL 3 RETURN !------------------------

400:!----- PUT routine --PUT 0,0 + cent -f*gon,0 PUT 0,stgoing/2+cent,0 PUT numrisr*srisrht-srisrht/2, numrisr*stgoing+cent,0 PUT num*ris,(num)*gon+cent,0 FOR N=num to 1 step -1 PUT N*ris,(N - f)*gon+cent,0 PUT N*ris,(N-1-f)*gon+cent-rak,0 IF bulrak THEN PUT N*ris-rak,(N-1-f)*gon+cent-rak,0 PUT N*ris-rak,(N-1-f)*gon+cent,0 ENDIF NEXT N PUT 0,0+cent-f*gon,0 RETURN !------------------------+

PROJECT2 3,270,3 HOTSPOT2 0,0 HOTSPOT2 0,numrisr*stgoing ADD2 0,-cent ROT2 90+alphangl/2 GOSUB 100 ROT2 stangl GOSUB 100 DEL 2 ROT2 90-alphangl/2 GOSUB 100 ROT2 -stangl GOSUB 100 DEL 2 END !_______________________ 100: !draw hotspots HOTSPOT2 cent,0 HOTSPOT2 cent+numrisr*stgoing,0 RETURN

!Curved Theatre Seating !3D Script

The 2D symbol, with hotspots


The GDL Cookbook 3 – Voyager

Spiral Staircase This exercise looks at bPRISM, PUT & GET

bPRISM_ is special


HE Spiral Staircase follows on logically from the two previous examples. It is an important example though, because it shows a reason why Graphisoft made bPRISM exceptional in being able to tolerate a negative figure for depth. If ‘width’ had to be positive, the stairwell radius could never be smaller than the stairwidth.

3D Script As with all the staircases, the only way to make it parametric is to master the use of the PUT command in a FOR... NEXT loop to allow a variable number of risers. If you wish the origin to be in the centre of the staircase, you need an offset at the start of the 3D script. You also need a ROTx move at the start to make the staircase stand upright. It is very timesaving if you can use the same technique, with minor variations, to define the handrail. The drawback of this is that it has to be a rectangular section. If you wanted a round tubular section, you would have to use a helical TUBE routine – similar to the ‘Long Handrail’ exercise in the GDL Cookbook, but applying a height change to each point, according to the gradient of the stair.

2D Script It would be very tiresome to script this fully in 2D, and unless you have dozens of spiral stairs in the building, you would not get a speed benefit from doing so: therefore you can be contented with a PROJECT2 command. What you must do is to ensure that you have HOTSPOTs in the right places to help you pick up the stair. There is a little IF statement that allows you to make the stair stretchy. If you stretch it, the diameter of the stairwell is changed. 2.52

!Stair spiral - 3D Script MATERIAL matl: PEN pcol GOSUB 50:!Error checking !Globals ADDy -A/2 ROTx 90 GOSUB 100:!Put the locations for Stair !Now draw the Stair bPRISM_ matl,matl,matl, nsp/3,-width,A/2, GET(nsp) IF hrhit>riser THEN GOSUB 200:!Handrail DEL top END:!——————————————————————— 50:!Error checking IF width>A/2 THEN width=A/2.01 IF rakd>going/3 THEN rakd=going/3 RETURN 100:!Put the locations for Stair PUT 0,0,15 PUT going,0,15 PUT numrisr*going,(numrisr-1)*riser,15 FOR N=numrisr to 1 step -1 PUT N*going+rakd,N*riser, 15 PUT (N-1)*going,N*riser, 15 NEXT N PUT 0,0,15 RETURN 200:!PUT locations for Handrail PUT 0,0,15, 0,0.04,15 PUT numrisr*going, numrisr*riser+0.04,15, numrisr*going, numrisr*riser,15 !Now draw the Handrail ADDy hrhit bPRISM_ matl,matl,matl, nsp/3,-0.04,A/2, GET(nsp) DEL 1 RETURN

!Spiral Staircase - 2D script HOTSPOT2 0,0 HOTSPOT2 0,-A/2 HOTSPOT2 0,-A/2+width HOTSPOT2 A/2,0 IF stret THEN HOTSPOT2 -A/2,0 PROJECT2 3,270,2 !Do it last

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

The Secrets of Labels – you can make your own graphic label


ABELS have improved tremendously with 6.5 and present some interesting challenges for the GDL user. There are new Global Variables (GV) relating to labels. Your first impression of Labels is that they allow you to place a pointer, drag away slightly and then plant a text label near the dragged line. However, labels can be more powerful, they can have a graphic design, such as ones referring to other drawings, to internal wall elevation drawings, wall information etc. A pop-down menu in the settings box enables you to select a graphic label, and you are provided suddenly with a lot of helpful parameters to apply to the object. Label objects are 2D scripted objects which can contain boxes, circles and lettering or numbers according to the way you like labels to be done. You can build your own graphic label objects, and use the GVs to act intelligently on user choices in the settings box.

One of the graphic labels supplied in your existing ArchiCAD Library

identified with a code. Upon creation of the label, the user just types in the desired code and the full text of the note is displayed. Very useful for updating! (although this is a complicated matter when it gets to import scripts and User Interface). Labels are normally saved to the labels folder along with other 2D objects, and they will show in the labels pop-down menu as long as they are in a loaded library. So you could build custom labels specially for one project if a generic one is too much bother to make. In fact they do not need to be scripted at all. You can build a static graphic symbol in the 2D symbol window of the Label object, and it will work; or you can write a short script for text, and use a FRAGMENT2 ALL,1 command to show a drawn 2D symbol. Of course the true GDL user will have in mind that scripted objects can be smart and parametric, unlike a mere symbol. Label objects can input, process, display and/or output to a text file the labelled element's parameters or features. Laurent Godel writes: A nice label I am still working on is the automatic label. Instead of typing all your notes repeatedly you have them stored inside a text file, where each is ©Copyright Marmalade 1998, 1999, 2000, 2001

Let’s try to make a Label Object Labels are helped by using the Global variables – these help you decide on pen colour, font names and characteristics. Unfortunately, the GVs do not work when in the GDL environment, and ‘check script’ always reports an error when you use them. So it’s difficult to find a real error when the error checker constantly flags up a spurious error. If you save the label and use it in the floor plan, you can see that the GVs work correctly. The first example is a text-only label object where full use is made of Global variables. Every parameter except the actual message is a GV. This object will be developing a box, so boxsh has appeared for shape. This text label may be all you need, as labels have an inbuilt feature to put a box round the label text, but it is very crude and close fitting; you might want an ellipse or hexagonal shaped box. 2.53

The GDL Cookbook 3 – Voyager


Ultra simple Label object There is no need to create any parameters for the text characteristics, they are all in the main settings box for the label

Although we have A and B available to use, it is better to make the box fit around the lettering – scripted hotspots do not stretch. The Label tool has internal data structures that place stretchy hotspots in a label bounding box and items with B dimensions will stretch. So, you have entered a string of text, called messag. Lettering size is calculated by two methods. Width is STW(messag) and height is LABEL_TEXT_SIZE. Both of these need tweaking to make them work in metres and to be scale sensitive using A_ (GLOB_SCALE). The notional box size is increased all round in proportion to the height of the text. Bug! I built a User interface (here) for the box shape only to find that although the box changes shape perfectly in the settings box, it refuses to change in the actual floor plan. This cannot be intended to happen. In fact, Label objects are sensitive flowers which, if you use the User interface too much, the GDL suffers progressive disintegration and all the parameters dissappear or become equal to infinity. Question! when you have a geometric shape (such as a POLY2) included in the symbol, the text dances up and down and left and right and never sticks to the right place relative to the arrow line or to its XY values. It’s another part of the internal Label toolbox which likes to reposition the entire graphic according to a position option in the settings box. I have got round it here by adjusting all graphics downwards (so that they are centrally oriented to the text) and then work the POLY2 from there.


!Label Object – Full 2D Script IF boxsh='None' THEN bsh=0 IF boxsh='Rectangular' THEN bsh=1 IF boxsh='Diamond' THEN bsh=2 Parsing the IF boxsh='Hex' THEN bsh=3 Value list IF boxsh='Circle' THEN bsh=4 IF boxsh='Oval' THEN bsh=5 SET FILL boxfil DEFINE STYLE 'labeltext' LABEL_FONT_NAME, LABEL_TEXT_SIZE,LABEL_ANCHOR_POS, LABEL_FONT_STYLE Text is almost SET STYLE 'labeltext' entirely based PEN LABEL_TEXT_PEN on Global sthit=LABEL_TEXT_SIZE*A_*2/1000 variables stlen=STW(messag)*A_/1000+sthit/2 TEXT2 sthit/4,0,messag Subroutines PEN pcol handle the SET FILL boxfil rest of the GOSUB 100+bsh work END:!_____________________________ 100:!None As many of these RETURN box shapes are 101:!Rectangular similar, it saves ADD2 0,-sthit/2 trouble to use PUT 0,sthit/2,mlin, PUT & GET stlen,sthit/2,mlin, stlen,-sthit/2,mlin, 0,-sthit/2,mlin, ‘mlin’ is a flag to 0,sthit/2,mlin draw or not POLY2_ NSP/3,7,GET(NSP) draw the line – DEL 1 so the user can RETURN have a box of fill 102:!Diamond – stretchy pattern if they p=LABEL_TEXT_SIZE*A_/1000 wish ADD2 0,-sthit/2 PUT -p,0,mlin, The Hex and stlen/2,B/2,mlin, Diamond shapes stlen+p,0,mlin, stlen/2,-B/2,mlin, need to be -p,0,mlin slightly longer POLY2_ NSP/3,7,GET(NSP) than the DEL 1 rectangle, and RETURN ‘p’ is a small 103:!Hex tweak to the box p=LABEL_TEXT_SIZE*A_/1000 width ADD2 0,-sthit/2 PUT 0,sthit/2,mlin, The ADD2 0, stlen,sthit/2,mlin, sthit/2 seems to stlen+p,0,mlin, stlen,-sthit/2,mlin, be a lifesaver 0,-sthit/2,mlin, here -p,0,mlin, 0, sthit/2,mlin POLY2_ NSP/3,7,GET(NSP) DEL 1 RETURN 104:!Circle and Ellipse ADD2 0,-sthit/2 MUL2 1,B/stlen PUT stlen/2+sthit/8,0,900+mlin, stlen/2,360,4000+mlin POLY2_ NSP/3,7,GET(NSP) DEL 2 RETURN VALUES 'boxsh' 'None', 'Rectangular', 105:!Oval 'Diamond','Hex', ADD2 0,-sthit/2 'Circle','Oval' PUT 0,sthit/2,mlin, stlen,sthit/2,mlin, stlen,-sthit/2,1000+mlin, The Value List is in 0,-sthit/2,mlin, the Parameter script 0,sthit/2,1000+mlin, stlen,sthit/2,mlin POLY2_ NSP/3,7,GET(NSP) DEL 1 RETURN

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Label Arrays – show position W

ITH a bit of help from Laurent Godel, we have sussed out how the label arrays work. Here is a useful little object. This object is a label graphic (.LSM object) that simply shows the location of the arrow head relative to the project origin. This could be done with some neat 2D scripting in a normal GDL object, but you wouldn’t get some of the smart features that are included in the API that governs labels. The addition of a graphic label gives you the best of both worlds. This can be genuinely useful in manufacturing where you can lay out components according to locations in a drawing. It could also be useful in surveying where you want to record onto the survey map the XY location of boundary points, trees, fence lines, benchmarks. Simply point the label tool at the point of interest and click! you have it. One drawback is that if the label is applied to a hotspot, it makes the computer beep, and doesn’t plant the label. This is a bug not a feature. However, you can place the label next to the hotspot, and then move it and drop the arrowhead on the hotspot. The label shows its XY location relative to the main project origin, so if you want to work to a different origin, you can enter a standard XY offset to each label. LABEL_POSITION [3][2]

... is another Global Variable, but contains 6 numbers, arranged in 3 groups of 2. The most important one is the first group, LABEL_POSITION[1][1] and [2] which show the X and Y location of the actual text element. The other two show relative distances of the elbow and arrowhead. By working them all together, you get the location of the arrowhead.

2D Script The routine here could be rendered down, almost to one very long line, but it makes sense to break it into blocks of code and to provide the user with sensible features. This object allows the user to enter the text size according to actual dimensions, thus making it scale sensitive – it remains attached to the object regardless of the drawing scale (doesn’t blow up and become enormous if you change from 1/50 to 1/100). The precision could be useful. If your object is used in a prefabrication workshop, people are working to millimetres or smaller. If marking trees in a field, then low precision is adequate. This works in metric, but could be adapted for use with imperial.

©Copyright Marmalade 1998, 1999, 2000, 2001

!LABEL_POSITION !ARRAY [3][2] !Text insertion point x1=LABEL_POSITION[1][1]-xoff y1=LABEL_POSITION[1][2]-yoff !Middle insertion point (relative to 1st) x2=LABEL_POSITION[2][1] y2=LABEL_POSITION[2][2] !Arrowhead position (relative to 2nd) x3=LABEL_POSITION[3][1] y3=LABEL_POSITION[3][2] !Decimal precision levels IF precis='Low' THEN labstringx=STR('%.1m',x1+x2+x3) labstringy=STR('%.1m',y1+y2+y3) ENDIF IF precis='Medium' THEN labstringx=STR('%.3m',x1+x2+x3) labstringy=STR('%.3m',y1+y2+y3) ENDIF IF precis='High' THEN labstringx=STR('%.5m',x1+x2+x3) labstringy=STR('%.5m',y1+y2+y3) ENDIF !Do it now! DEFINE STYLE 'labltxt' 'Arial', fsiz*1000/A_,1,0 SET STYLE 'labltxt' TEXT2 0,0, labstringx TEXT2 0,-fsiz*1.1,labstringy

Value list in parameter script VALUES 'precis' 'Low','Medium','High'


The GDL Cookbook 3 – Voyager

3D GDL –Building Elements C WALL and bWALL: are

commands that GDL users do not penetrate, as they are typical of the most difficult parts of the GDL manual; strangely, they spend pages detailing the use of GDL commands that are only likely to be used in autoscripting. You get to the point where the difficulty of writing something in GDL is only justifiable if you are going to get parametric objects. Otherwise, you are better creating it with the normal ArchiCAD tools, and saving the result as an object. I have tried making objects with them, but these are all easier to make with SLAB, PRISM and so forth. There is also XWALL, for walls with holes, cuts and everything. cROOF The same can be said for CROOF, although CROOF is less difficult for someone really determined to get custom window shapes for rooflighting. I guess these commands are not really intended for people using creative GDL scripting. If you are a Voyager, you will be able to cope with the example given in the manual.


VERT, EDGE, PGON, BODY, ODY is used to do a cjeck PIPG, BASE, TEVE and on the integrity of 3D comCOOR. mands, and I recommend you to These commands are vital to imported Autoscripted objects. If you import DXF files, you get them condensed into pages of scripted garbage using these commands. So while it’s useful to have a way of interpreting DXF imports, I doubt if you will use them for making new objects. VERT and COOR can be used to exert greater control over mapped textures in photo rendering. See the section on Texture Mapping later in the Voyager course.

use it in the form BODY -1. All autoscripted object commands have BODY -1 before and after them, and ArchiCAD writes these in to improve the reliability of the objects. So it cannot do any harm to write this in after long Prisms, Revolves and other bodies. I have found in practice that objects made with TUBE (remember the ‘mental health warning’) will render more reliably with the BODY -1 before and after the command. Conclusion: Use BODY -1



PRISM allow you to chamfer the top edge of a prism, and to have different materials for each surface. Put

an angle in and you get a hipped roof effect. Put in zero for angle, and you get round edges. RESOL works differently. Usually, in a 90degree curve, you would get 1/4 of the resolution i.e. RESOL 40 would give 10 edges. Here, you get 4 times the normal resol figure; RESOL 10 gives 10 edges. TOLER works with FPRISM but again, it works at 4 times the expected figure. Most realistic furnishing and other objects have rounded edges; this FPRISM function is a real help; but whenever possible, use a simple 45˚ chamfer, which can give a rounded look without creating hundreds of polygons. !FPRISM demonstration !Syntax: – FPRISM_ topmat, botmat, sidmat, hillmat, Bug Report: !number of pts, thickness, angle, hill_height FPRISM does not have masking to hide the RESOL rsl: PEN 1 FPRISM_ "Sandstone","Pine","Zinc","Sandstone", many horizontal lines 9+2,0.1,sang,hhit, 0.00,0.00,15, on rounded surfaces -0.10,0.30,15, on the ‘hill’. FPRISM was bad in early AC6 releases – could not work with MULZ -1, and the Hill material determined the side and bottom materials. 2.56

0.10,0.30,15, 0.10,0.40,15, 0.20,0.40,13, 0.20,0.10,1013, 0.15,0.10,15, 0.15,0.00,15, 0.00,0.00,-1, 0.05,0.10,900, !hole 0.05,360,4000 !hole

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager


is a routine for cutting a roofplane through the top of a Prism. You can use a normal prism with a Cutplane to achieve the same result. It has always been difficult to use any of the GDL commands which use Vectors (ROT, and one version of CUTPLANE) because of the effort to imagine the re-

sult, so some trial and error is required. In this case the vector draws a line on the X,Y plane, and the roof is cut at right angles to that line, at the height and angle specified. If the roofplane is cutting too harshly (i.e. it cuts through the floor of the Prism) it will not get drawn.

!SPRISM demonstration !Syntax: – SPRISM_ topmat,botmat,sidmat,hillmat, ! number of points,X_begin,Y_begin,X_end,Y_end,height,angle, ! x1,y1,mask, x2,y2,mask..... xn,yn,mask RESOL 10: PEN 1 SPRISM_ "Sandstone","Pine","Zinc", 9+2,0,0,0.1,0.1,0.2,-30, 0.00,0.00,15, -0.10,0.30,15, 0.10,0.30,15, 0.10,0.40,15, 0.20,0.40,13, 0.20,0.10,1013,


0.15,0.10,15, 0.15,0.00,15, 0.00,0.00,-1, 0.05,0.10,900, !hole 0.05,360,4000 !hole

Frankly, it’s easier to use CUTPLANE, once you have got the hang of it.

IGHT: I offer an example of the LIGHT command in the

Discovery Cookbook (Standard Lamp), and there is one example in the Voyager, in the Anglepoise lamp. I have looked hard at this topic in the Motorist smart car, in which the car headlights are the only lightsources in a model several miles wide! Remember that an object (eg bulb in the light fitting) that emits light can be assigned Material indices. For example, when the light is ON, it can be ‘Lamp’ and when OFF, it can be ‘Whitewash’. Only when the light is directional can it cast shadows – a general brightener does not cast shadows. Lamps which cast shadows result in almost disastrous rendering times in ArchiCAD, but are not too insufferable if used in Artlantis. Directional LIGHT travels along the X-axis. If you want the light to act directionally, you have to orient it carefully in the correct direction. Lamps are only effective if you turn ‘Lamps’ on as a light source in the PhotoRendering settings box. If you want an easy life, this routine for a general brightener could use the values of 1,1,1 for Red Green and Blue. But the standard parameter box for a lamp gives you the means to control brightness and to control the Red, Green or Blue proportions of a light. The complex routine shows how to do this.

Spotlight: This light was used as a car headlamp in Motorist. The direction of glow is already horizontal, so a 5 degree tilt is enough to make the light beam lay correctly on the road. Shadows are turned off (it would slow down rendering too much) and the beam is designed to project 50 metres in a narrow beam. Two materials have been defined for the white disk of the headlight, very white with a maximum ‘emission’ for the light on, and very white and reflective for the light off. ©Copyright Marmalade 1998, 1999, 2000, 2001

Syntax: LIGHT red, green, blue, shadow,radius, alpha, beta, anglefalloff, dist1,dist2,distfalloff !General Brightener – simple LIGHT 1,1,1, !R,G,B 0,0, !shad,rad 0,0,0, !alp,bet,angfall 0,dist,0 !falloff !General Brightener – complex gb=G/100 !brightness index LIGHT gb*D,gb*E,gb*F, !R,G,B 0,0, !shad,rad 0,0,0, !alp,bet,angfall 0,gb*dist,(gb-1)^2 !falloff !Headlight IF headon THEN MATERIAL "Lamp-Whitebright" ADD 0.3,0,0.5 ROTy -5 LIGHT 1,1,1, 0,0.1, 15,20,0.5, 1,50,0.1 DEL 2 ELSE MATERIAL "White_Bright" ENDIF


The GDL Cookbook 3 – Voyager

More Cutting CUTPOLY:

has huge advantages over CUTPLANE in that it operates like a cookie cutter through the model. You define the profile of CUTPOLY with similar syntax to a common PRISM. It grows up from the X-Y plane. The direction of the cut can be modified by maneouvring it into position (like I advise for CUTPLANE, and just like you would do if you were trying to manoevre a PRISM to the same location) or it can defined with a final x,y,z statement at the end of the CUTPOLY statement which defines a vector (from 0,0,0). A limitation is that the profiles MUST be CONVEX. Concave or more complex shapes would have to be built from a succession of convex CUTPOLY statements. UTPOLYA: If you want holes with Polylines enabled, you can use a variation called CUTPOLYA which is analogous to PRISM_ in that every XY location has to be followed by a masking value, usually 15. You are supposed to be able to point CUTPOLYA in a certain direction and fire it off a defined distance, but this feature does not work in AC_6 or 6.5 and it is best to assume that the cut profile is infinite in length. There is also CUTSHAPE but I have not had occasion to use it yet when Cutpoly was perfectly able to meet the need. ALLHOLE: has almost identical syntax to CUTPOLYA, but only operates when it is part of a window object. It supports polylines. It drills a holes through a wall, but must not have any complicated peninsulas, or it will not happen, and the window will default to a rectangle based on A and B. See the Curvy Windows in both the Discovery and Voyager courses for examples. Like CUTPOLY, you maneouvre it to its destination as if you were moving a PRISM, and the job is done.



!CUTPOLY demonstration !Syntax: – CUTPOLY no_of_cutting points, ! x1,y1,x2,y2,...xn,yn ! (define a poly cut plane) ! [,x,y,z] (optional) ! defines the vector direction ! of cutting. !Remember to issue a CUTEND after !you have made your object PEN 1 MATERIAL "Gold" RESOL 16 ADDz 0.02 ROTx 90 CUTPOLY 4, -0.02, 0, 0.02, 0, 0.02, 0.02, -0.02, 0.02 DEL 2 !Now for the object! CONE 0.04,0.04,0.06,90,90 CUTEND !Close with a Cutend

ADDx A/2 ROTz 90-angl+ABS(mitr) ROTx 90 circle 0.5 CUTPLANE DEL 3

Show the Blade!


UTPLANE is most easily done with the ‘angle method’ – maneovre the imaginary cutting blade into position, then issue the command. Sometimes, you get very confused with the pluses and minuses of the angles. Put an ACTUAL cutting disc at the same place so you can see exactly which way it is facing.

Teamwork Problem Eric Batte wrote, If you use Teamwork, should you use local drafts instead of working direct from the PLP file? If so, why? How do you organize the drafts? Where are the drafts stored so that they may be backed-up by the server? This seems to be the recommended working method from GS as well, but I don't structure it like this in my office. Gyuri Juhasz,_Gyuri <> Using drafts is good because: – You can save your design without being online. – You can explore multiple design alternatives within your workspace and save them as separate drafts under different names. – You can work undisturbed in your workspace and send the changes only when all the details are correct. This means 2.58

your teammates will not see any mess of an unfinished state of your elements. How this works? When signing in, you get a Sign-In ID. Any drafts you save refer to this ID, regardless of the name of the draft file itself. If you think of your workspace as a whole entity, you can have multiple stages or variations of that in separate drafts. When you send changes, your earlier workspace contents in the Team Project will be replaced by the elements of the draft you send changes from. Sending changes from another draft does the same – it replaces the elements you have just sent from the other draft. The drafts themselves can be stored anywhere. They are pretty much like Solo Projects, the only difference is the rights to send changes to a particular Team Project. Think of them and handle them accordingly. Hope this helps, ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

More Complex Window I

N THE DISCOVERY volume, you will find the exercise called ‘Simple Window’. This laid down rules for building windows with a script. Quite often, you need a window with special jamb details, a curved lintel, a projecting sill, or some other complication. This exercise shows how to provide some of these complications.

Use a Macro for the window To save typing the original window again, try using the CALL command to bring in the window from the Discovery course. You can either type in the CALL manually, or you can make a small wall, put the window into it, save that as a temporary library object, then open that and copy the little bit of text above. As we want to be able to redefine materials etc, and use the same A and B as before, you can use A=A, and so on, using identical parameter names. Window and Doors always cut a rectangular shape in a wall, so it is important that your A and B parameters apply to the window itself; but you may need to cut a hole much bigger to accommodate arched lintels or the like.

Use GDL for the surround Now you can make it more complex – add in the parameters for the Lintel and Sill. The basic idea is always to keep the window object rectangular. So you may have to provide a jamb around the window. If the lintel and sill both project from the face of the wall, you can keep things simple. Just add them to the 3D model, and they will exist in the 3D model. This exercise shows you the ‘pukka’ method whereby you might also have to build jambs around the window. This also ensure that you have the correct materials on the reveals. A plain window in an ArchiCAD wall will have brick on the inside reveals, or plaster on the outside reveals – not good! By building a jamb element, you ensure A and B are the official window sizes. The Oversize factors allow you to that the reveals render correctly. insert jamb, lintel and sill elements.

Calculate the volume of a Mesh

Writing for older versions

Darren Park: I need to calculate the volume of a mesh. Is this easily done? (Using Version 6.5)


Dwight Atkinson: Try selecting the mesh in question and performing a Calculate> List Elements> Basic. This routine returns a list of the mesh with a ‘volume’ attached. ©Copyright Marmalade 1998, 1999, 2000, 2001

F you are using ArchiCAD 6.x, the people you send work to could be dismayed to find that nothing you write works in version 5.0 or 5.1. Do not despair. If you have written in 5.0 compatible code (avoiding Fprism, Cutpoly, arrays and a few other things) you can email them the 3D script, the 2D script and a list of parameters as text files, and these can be dropped into place. Rewriting the parameters is the longest task. 2.59

The GDL Cookbook 3 – Voyager

In the Library box where you enter new parameters, you can enter ‘Oversize’ parameters for width and height. You can enter real dimensions, or can put in variables, or expressions. Here, we want it to cut a hole to conform to the widest element – either the lintel or the sill. Use the MAX factor.

3D Script The window is CALLED from the previous exercise. the Call command refers to the same parameter names, A,B, fmat and gmat. Lift the window frame if you wish to control the amount it is recessed into the opening (if you use ArchiCAD’s control, it may recess the whole assembly – not good!) wmax and recp just save you typing later by establishing them as ‘internal parameters’ (calculated from main parameters) to define window width and recess distance to the centre of the frame. As it was a 100mm frame, the distance is winrec+0.05. The Jamb is just a prism built around the window frame. It is important to make full use of masking, to get it looking right. The outside of the prism has a masking value of 8 (show face only, no lines) to avoid a line showing around the opening. The inside face of the prism, showing the reveals, is done with 15, because you want the lines to show. Two prisms are drawn, one for the external wall surface, and one for the internal wall surface. the materials and thicknesses are based on Global variables G_, H_, I_ and C_. The lintel face is just another prism. The Sill is more complicated. Because it is profiled, it has to be built upwards as a prism and then a ROTy 90 lays it down into position.

2D Script The one here is simple, but it is not ideal. The Project2 command (first shown to you in the Simple Window exercise) has to be in wireline, but then it shows too much of the construction lines. If the window is to be used a lot, it is better to be fully scripted, in which you could also add fill pattern, more hotspots, change the constructional detail at different scales and so on. The A and B dimensions in the Library settings box will continue to apply to the window frame only.

Until you put the 3D surrounding elements in, you can see the space left around the window

!2D - complex window !This could be better !if fully scripted ROT2 180 PROJECT2 4,90,1


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

3D camera view, showing how there are no lines around the jamb element – buy using 8 as the masking value.

3D view in the ‘bottom plan view position’ showing the whole assembly of jamb, lintol and sill.

Just to remind you, you only need to do the jamb element if you have receding or hollow elements in the window (such as a fanlight). It isnt really necessary in this particular model.

!More Complex Window !Voyager ADDz winrec CALL “windo-discovery” PARAMETERS A=A,B=B,fmat=fmat,gmat=gmat DEL 1 wmax=MAX(lintwo,sillwo) !largest width recp=winrec+0.05 !centre point of frame !Jambs & wall above & below !External face MATERIAL “Red Brick”!H_ PRISM_ 5+5,winrec+0.05, -A/2-wmax,-sillht, 8, -A/2-wmax,B+lintht, 8, A/2+wmax,B+lintht, 8, A/2+wmax,-sillht, 8, -A/2-wmax,-sillht, -1,

If you use G_, H_ and I_, -A/2,0-0.01,15, you can get the fill-in parts -A/2,B+0.01,15, around the window to read A/2,B+0.01,15, A/2,0-0.01,15, the existing wall parameters -A/2,0-0.01,-1 !Internal face ADDz winrec+0.05 MATERIAL “whitewash”!G_ PRISM_ 5+5,C_-winrec-0.05, -A/2-wmax,-sillht, 8, -A/2-wmax,B+lintht, 8, A/2+wmax,B+lintht, 8, A/2+wmax,-sillht, 8, -A/2-wmax,-sillht, -1, -A/2,0,15, -A/2,B,15, A/2,B,15, A/2,0,15, -A/2,0,-1 DEL 1 !Lintel face ADDz -0.01 MATERIAL lmat PRISM 4,winrec+0.05, -A/2-lintwo,B, -A/2-lintwo,B+lintht, A/2+lintwo,B+lintht, A/2+lintwo,B !Sill Piece ADD -A/2-sillwo,0,winrec ROTy 90 MATERIAL smat PRISM 5,A+sillwo*2, 0,0, winrec,0, winrec+0.05,-sillht/2, winrec+0.05,-sillht, 0,-sillht DEL 2 END:!————————————————

3D Text Syntax: TEXT depth,0,string

3D Text: Depth is in metres, zero is always zero, String is in quote marks unless it’s a parameter. Height has to be defined with DEFINE STYLE. It’s a curious anomaly, that the definition of 3D text height is in millimetres. So if you want the lettering to be 0.6 metres high (2’-0”) you write in 600 for the height and write the depth in metres. DEFINE STYLE ‘3dtextyl’ ‘Times’,600,1,0 SET STYLE ‘3dtextyl’ RESOL 9 TEXT 0.1,0,’3D Text’ ©Copyright Marmalade 1998, 1999, 2000, 2001

It is vital to apply a RESOL command before writing 3D text, or your model may be crippled with too many polygons. Almost every character has curved surfaces. RESOL 9 is the lowest you can go to. Below that you get vertical lines showing. Above, RESOL 8 and 9


The GDL Cookbook 3 – Voyager

Glazing Assembly THIS GLAZING infil panel could be useful, and the exercise illustrates: • Using Subroutines to ensure modularity • Using FOR...NEXT loops for repetition • PUT and GET • 2D scripting, better than PROJECT2 • Using an Array in the Parameter box Parameters: You should use A to define window width, zzyzx the height. The user is offered a TILT to the glazing, because when I first did this, the client had tilted glazing. Although this is a Glazing system, it is NOT SAVED AS A ‘WINDOW’ (in the ArchiCAD definition). This is because it is designed to sit in a frame construction building as an OBJECT – not to be punched into a wall. If it’s in a wall, you have to put an empty hole in the wall first. Transm is an Array and you can click on the array button – make 5 heights, which can be all zero or any combination of heights.

It is all done with FOR... NEXT Loops

3D Script The executive script is resolved into subroutines, so that each part of the model can be separately drawn. Use the Master Script to set up variables that are NOT in the parameter box, but will be used in the script, such as mulspac. These are ‘internal parameters’ – they are there to help you, but are not modifiable by the user. As this exercise is for general 3D modelling, it doesn’t go in for special features like mitring the ends of the transoms – they just cross through the mullions, and butt against the jamb sections.

PUT & GET This demonstrates a economical use of PUT and GET. The Mullion outline is PUT once only, in the Master Script. The 2D and 3D script use the USE(NSP) command, which uses the outline without emptying the buffer. !WindowWall !MasterScript wid=A height=zzyzx mulwid = 0.05 muldep=0.12 mulspac=(wid-mulwid)/numbay PUT 0.000, 0.0, 0.000, 0.05, 0.077, 0.05, 0.077, 0.031, 0.106, 0.031, 0.106, 0.05, 0.121, 0.05, 0.121, 0.0, 0.106, 0.0, 0.106, 0.019, 0.077, 0.019, 0.077, 0.0, 0.000, 0.0


Here, a simplified mullion is provided, but you could CALL one that exists as a separate object, if you were using proprietary components – which may have been supplied to you as manufacturers DXF profiles.

!WindowWall 3D Script ROTx tiltang !global tilt MATERIAL mmatl GOSUB 100: !Sole & Head GOSUB 200: !Mullions GOSUB 300: !Transoms IF shoglas THEN GOSUB 600: !Glass END !------------------------150: !Mullion section !simplified Astrawall PRISM NSP/2,len, If you use GET here USE(NSP) (instead of USE), RETURN you will empty the 200: !MULLIONS buffer and no more len=height-mulwid*2 mullions could be ADDz mulwid drawn FOR k=1 TO numbay+1 ADDx mulspac*(k-1) Remember, this is an ROTz -90 Object, not a Window. GOSUB 150 !Draw it! You can make it into a DEL 2 NEXT k ‘window’ by applying a DEL 1 ROTx -90 to the whole RETURN 3D thing, saving it as a 300: !TRANSOMS window, and writing len=A-mulwid*2 the 2D script that I FOR k=1 TO 5 recommend for IF transm[k] THEN Windows. ADD mulwid,0, transm[k]+mulwid ROTy 90 ROTz -90 GOSUB 150 DEL 3 ENDIF NEXT k RETURN 600: !SHOW GLASS MATERIAL gmatl ADD mulwid,-0.1,mulwid: BLOCK A-mulwid*2,0.015, height-mulwid*2 The user enters heights DEL 1 for up to 5 transoms in RETURN the array ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

2D Script It is not practical to use PROJECT2 unless the window is tilted. If you do it hidden line, you cannot see the mullions; if you do it wireline, you get a excessive mass of detail in the lines. The 2D script is similar to the 3D script; it draws the mullions as a subroutine in a FOR... NEXT loop, using the same Subroutine number in each script (here, 150:). The 2D script reads parameters from the main Parameter box, and also from the Master Script.

!WindowWall – 2D script HOTSPOT2 0,0 HOTSPOT2 A,0 IF tiltang THEN PROJECT2 3,270,2 HOTSPOT2 0,-height*SIN(tiltang) HOTSPOT2 A,-height*SIN(tiltang) ENDIF RECT2 0,0, A,-0.121 !Outline FOR k=1 TO numbay+1 !Mullions ADD2 mulspac*(k-1),0 GOSUB 150: !mullion DEL 1 NEXT k !Glass RECT2 0.032,-0.1,A-0.032,-0.08 END:!------------------150: !Mullion ROT2 -90 POLY2 NSP/2,1, USE(NSP) DEL 1 RETURN

Curvy topped Window P

REVIOUSLY, making windows any shape other than a rectangle was a bit of a nightmare; you had to construct chunks of wall around the window, investing it with the exact qualities of the wall around it, and paying deep attention to the line drawing of the PRISM that makes the wall, and mimicking in reverse the profile of the window. ArchiCAD 6 brings you the command WALLHOLE which is a boon to all GDL users. You can define any shape, no matter how complex, providing it does not have any concavities, and the shape will be made for you. If you have concavities in the window outline, then you can use additional Wallholes until the job is done. Thus you can concentrate on building the window only, letting the Wall reshape itself as if made of liquid, around the window. This exercise is useful in several things: • Using Value Lists to set up the parameters • Using Arrays to store numbers • Using TUBE command to make the frame • PUT and GET to build elements • Using circle trigonometry to calculate curvature variables • Using the WALLHOLE command • Making an object stretchy

Remember the Golden rule of Window making is that you build it with the external face flat on the ground, with the origin at the midwidth if possible. ©Copyright Marmalade 1998, 1999, 2000, 2001

This window is a portion of a much larger ‘Super Window’ project that I am working on, which contains 10 different window shapes in one script. This exercise shows two of them. There is a simpler version of this window in the Discovery section

Values List The window shape is a parameter called ‘winshape’, and you have a choice of putting in a ‘transom’. I tend to use Value lists even for simple Boolean choices, as it is more user friendly, and leaves the option of adding more choices later with easier coding. Thus, Value lists allow you a more structured approach. VALUES "winshape" "Arched","Pointed" VALUES "transom" "None", "Horizontal at Jamb ht"


The GDL Cookbook 3 – Voyager

Parameters A and B are always the most important parameters in window design as these are what make the window stretchy in its outline dimensions. You need to specify a Jamb height – the difference between the jamb height and the total height will determine the curvature. In case the window is to have a flat top, specify a length for the horizontal element, ‘winhor’. The frame is defined (‘fdep’ and ‘fwid’) and the projection of the sill element. Finally, you need to specify the materials in case the user has modified the material index for Glass.

Master Script Here, it reads and converts the Value list into numbers, converts A and B into ‘english’, checks for user’s errors (such as negative quantities) on the entry of parameters ‘winhor’, ‘sillpro’ and ‘jamhit’. !Curved top window !for GDL Cookbook !Master Script !Window Shape IF winshape="Arched" THEN wsh=4 IF winshape="Pointed" THEN wsh=8 Always parse the Value Lists first !Transom Option IF transom="None" THEN trnsm=0 IF transom="Horizontal at Jamb ht" THEN trnsm=1 tothit=B !Total Height winwid=A !Window width

!Limit length of window head winhor=ABS(winhor) IF winhor<fwid THEN winhor=fwid IF winhor>winwid*2/3 THEN winhor=winwid*2/3 fd=fdep/2 !Half Frame Depth IF jamhit<=fwid THEN jamhit=fwid !Sill Check sillpro=ABS(sillpro) !make sure it’s positive

3D Script !Curved top window – 3D Script !Part of Super-window !See MASTER SCRIPT for !Parameter organisation !Array for window X and Y’s DIM winxy[3][60] !3D Script begins..................... ADDz fdep/2 !Arched Window )))))) IF wsh=4 THEN GOSUB 140 !Pointed Central>>>>> IF wsh=8 THEN GOSUB 180 nfp=NSP/3 !Number of points in frame GOSUB 210:!Store numbers in an array GOSUB 250:!Wallhole command GOSUB 260:!Draw Glass GOSUB 270:!Draw Frame GOSUB 300:!Transom GOSUB 310:!Projecting Sill DEL 1 END:!-------------------------

Where did subroutines 100, 110, 120, 130 etc go to?? They are part of my ‘Super window’, offering a variety of shapes.


Executive Script: the array has to be declared before it is used. This can either be done in the Master or 3D script. Array winxy will hold all the XY locations and masking values of points on the window frame. Subroutines 140 and 180 go off and calculate the X,Y coordinates of the outline shape of the window. Then the remaining subroutines perform tasks (as annotated in the script). These two windows use what I call the ‘Swing the Cat!’ routine, going around a circular path calculating X and Y using COS and SIN.

Subroutines Curvature: The two calculations here establish the Radius and sweep angle of the two curves. They appear the same but are not. The arched window goes from round to flat, but the pointed window goes from round to pointed. So ‘curvwid’ and ‘curvhit’ change places. Control: If the user stretches or shrinks the window beyond reasonable limits, you will get an error. To avoid this, get it to devise a new value for ‘jamhit’ (jamb height), so a new ‘curvhit’ gets calculated which always produces a correct result (avoiding a ‘divide by zero error’). ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager 140:!Arched Window )))))) !Calculate Curve dimensions curvwid=(A-winhor)/2 !width of curved section curvhit=tothit-jamhit!Height of Curve

180:!Pointed Arch (Gothic style)>>>>>> !Calculate Curve dimensions curvwid=A/2 !width of curved section curvhit=tothit-jamhit !Height of Curve

!Allows window to modify jamb height IF curvhit<=fwid THEN !Control Minimum jamhit=tothit-fwid curvhit=fwid ENDIF IF curvhit>curvwid THEN !Control Maximum jamhit=tothit-curvwid curvhit=curvwid ENDIF

!Control jamb height IF curvhit<=curvwid THEN !Minimum jamhit=tothit-curvwid curvhit=curvwid ENDIF !No need to control maximum

‘curvhit’ angl=(90-ATN(curvwid/curvhit))*2 change places crad=curvwid/SIN(angl) stng=ABS(angl/10) !Stepping angle

!Locate points on the surface----------PUT -A/2,0,15, -A/2,jamhit,15

!Locate points on the surface----------PUT -A/2,0,15, -A/2,jamhit,15

FOR k=stng TO angl-stng STEP stng PUT -crad*COS(k)+crad-A/2,jamhit+crad*SIN(k),13 NEXT k

FOR k=-angl+stng TO -stng STEP stng PUT crad*SIN(k)-winhor/2 PUT -crad+curvhit+jamhit+crad*COS(k),13 NEXT k

PUT 0,tothit,13

‘curvwid’ and

angl=(90-ATN(curvhit/curvwid))*2 crad=curvhit/SIN(angl) stng=ABS(angl/10) !Stepping angle

!Centre point

FOR k=angl-stng TO stng STEP -stng PUT crad*COS(k)-crad+A/2,jamhit+crad*SIN(k),13 NEXT k

PUT -winhor/2,tothit,15, !Centre section winhor/2,tothit,15

PUT A/2,jamhit,15, A/2,0,15 RETURN

FOR k=stng TO angl-stng STEP stng PUT crad*SIN(k)+winhor/2 PUT -crad+curvhit+jamhit+crad*COS(k),13 NEXT k

Note that the Masking value for the points on the Curve are 13, not 15, to make it look smoother. The start and end points are 15, to draw the corners correctly.

PUT A/2,jamhit,15, A/2,0,15 RETURN

All that these two routines are doing is calculating the outlines of the window opening and PUTTING them into memory. Nothing else.

Remember these rules: • The polygon of points in a Wallhole must not close up. • The ones in the Glass MUST close up. • The ones for the frame must go round an extra two lengths because of the ‘phantom points’. This highlights the benefit of using an array – without it, you would have to do a complete recalculation every time. Finally, if the user wants a transom, they can have it, as a simple block of the same dimension as the frame. I have not built in more complex routines such as small glazing bars, but you could have a go at this yourself. Section/Elevation view of the two windows. ArchiCAD puts stretchy Hotspots at the corners if you have built the window with A and B.

ra di us


angl=(90-ATN((A/2)/win_bul))*2 radius RAD =(A/2)/SIN(angl)


This diagram shows how to calculate the centre of curvature if you are using a Prism with Polylines, or using the TUBE command to go round the top of a curved window. From the B window bulge (win_bul) and the width, you can calculate everything else you need to know.

CUTEND time saver


an g

Curved top windows

x=0, y=B+win_bul-RAD

A Curve topped window

©Copyright Marmalade 1998, 1999, 2000, 2001

Getting tired of adjusting the number of CUTENDs you have to write? Write a numcut=numcut+1 every time you issue a CUTPLANE or CUTPOLY. This routine can be left at the end of the script and never causes an error. WHILE numcut DO CUTEND: numcut=numcut-1 ENDWHILE 2.65

The GDL Cookbook 3 – Voyager 210:!Store numbers in an array FOR k=1 TO nfp !Put number into array winxy[1][k]=GET(1) !X coordinate winxy[2][k]=GET(1) !Y coordinate winxy[3][k]=GET(1) !Masking for hole NEXT k 210: This routine !Extend array to enable TUBE is putting the FOR k=1 TO 4 contents of the winxy[1][nfp+k]=winxy[1][k] memory buffer winxy[2][nfp+k]=winxy[2][k] into an array for winxy[3][nfp+k]=winxy[3][k] future use. The NEXT k same numbers RETURN are used for the 220:!Frame Outline Locations Wallhole, the PUT 0.00,-fd,0, Glass and the 0.00, fd,0, Frame. The array -fwid, fd,0, has to be -fwid,-fd,0, extended by a 0.00,-fd,0 np=5 !Number of points further four RETURN points to 250:!Wallhole command - all types accommodate FOR k=1 TO nfp !Read in array the TUBE PUT winxy[1][k], winxy[2][k],15 routine. NEXT k 220: This routine WALLHOLE NSP/3,1, GET(NSP) is defining the RETURN frame outline, to save having to 260:!Draw Glass for all types IF gmat>0 THEN type it in again FOR k=1 TO nfp+1 !Read in array for each window PUT winxy[1][k], winxy[2][k],1 type. NEXT k MATERIAL gmat POLY_ NSP/3, GET(NSP) ENDIF RETURN

270:!Draw Frame for all types GOSUB 220:!Get Frame Profile !Frame FOR k=1 TO nfp+3 !Read in array PUT winxy[1][k],winxy[2][k],0,0 NEXT k MATERIAL fmat TUBE np,nfp+3,63, GET(NSP) RETURN 300:!Transom IF trnsm THEN ADD -A/2+fwid,jamhit-fwid,-fd MATERIAL fmat BLOCK A-fwid*2,fwid,fdep DEL 1 ENDIF RETURN 310:!Projecting Sill IF sillpro THEN ROTy -90 ADDz -winwid/2 MATERIAL fmat PRISM 5,winwid, -fd,0, -fd,fwid, fd,fwid, fd+sillpro,fwid/2, fd+sillpro,0 The sill is built upright at DEL 2 first, then manoevred into ENDIF position RETURN

!Curved top window !2D Script !for GDL Cookbook !Part of Super-window ROT2 180 !Just to check that 2D works !PROJECT2 4,90,1 DEL 1 !Main Frame ADD2 -winwid/2,-fd RECT2 0,-fd,fwid,fd DEL 1 ADD2 winwid/2,-fd RECT2 0,-fd,-fwid,fd DEL 1 !Outline RECT2 -winwid/2,0, winwid/2,-fdep !Sill RECT2 -winwid/2,0,winwid/2,sillpro

3D view of the two window shapes, set into a wall. If you put the frame thickness ‘fdep’ into the frame thickness box in the parameters box, the window can be pushed deeper into the wall.

!Glass IF gmat THEN LINE2 -winwid/2+fwid,-fd, winwid/2-fwid,-fd ENDIF

2D Script It is always worth starting with a PROJECT2 4,90,1. This draws a wireline from the position and angle that you would see it if building the window from slabs. Gradually you build in a scripted solution that exactly matches with the project2 command. The Frames, the Outline, the Sill and finally the Glass. 2.66

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

The 6.5 User Interface – part 2 A

NYBODY who has used the Graphisoft doors in ArchiCAD 6.5 will recognise that a profound improvement has occurred to the user interface, the most noticeable being the arrival of the Pictorial Value list. The GDL-writer can now create a whole series of custom designed dialog boxes, offering a wealth of opportunities for better GDL. The manual does not explain how this is done. Let’s look at how to do this, and make some Golden Rules to ensure success.

Let’s make an example object Open and examine the object called UI_Tester.gsm. You may want to examine the 3D script in your own time for examples of PUT & GET, Cutpoly, Revolve, and Polylines, but for this exercise, it isn’t annotated with comments.

Parameters The parameter box is made as below, and of course, the user who like the traditional parameter box can still enjoy some new features such as hierarchically grouped parameters. The Object is defined with the use of a Value List, placed in the Parameter Script.

The procedure for producing ‘rocking button’ cascading parameter boxes is discussed in the Discovery section. VALUES 'objtyp' 'Cube','Cylinder', 'Sphere','Capsule','Dome','Pyramid', 'Cone','Torus','Tincan','Big_Ell', 'Dish','Handle'

3D Script This contains a dozen primary object shapes, and a conventional Values List is used to enable these to be selected from the normal parameters box. The objects are solely for the purpose of demonstrating the user interface

©Copyright Marmalade 1998, 1999, 2000, 2001

!User Interface demo !GDL Cookbook !3D Script – Executive portion IF objtyp='Cube' THEN ot=1 IF objtyp='Cylinder' THEN ot=2 IF objtyp='Sphere' THEN ot=3 IF objtyp='Capsule' THEN ot=4 IF objtyp='Dome' THEN ot=5 IF objtyp='Pyramid' THEN ot=6 IF objtyp='Cone' THEN ot=7 IF objtyp='Torus' THEN ot=8 IF objtyp='Tincan' THEN ot=9 IF objtyp='Big_Ell' THEN ot=10 IF objtyp='Dish' THEN ot=11 IF objtyp='Handle' THEN ot=12 d2=dm/2 !Half size MATERIAL omat PEN pcol RESOL 20 GOSUB 100+ot END:!----------------


The GDL Cookbook 3 – Voyager 101:!Cube d2=dm/2 PRISM 5,dm, d2, d2, -d2, d2, -d2, -d2, d2, -d2, d2, d2 RETURN 102:!Cylinder CYLIND dm,d2 RETURN 103:!Sphere SPHERE d2 RETURN 104:!Capsule ADDz d2 ROTy 90 ADDz -d2 CYLIND dm,d2 MULz -1 ELLIPS d2,d2 DEL 2 ADDz d2 ELLIPS d2,d2 DEL 3 RETURN 105:!Dome ROTy -90 FOR k=1 TO 8 ROTx k*45 PUT 0,d2/5,13, d2/2,d2/5,13, d2/2,-d2/5,1013, 0,-d2/5,15, 0,d2/5,15 CUTPOLYA NSP/3,1,0, GET(NSP) DEL 1 NEXT k

PUT 0,d2,1, d2,d2,1, d2,0,901, d2,-80,4001, d2-dm/10,80,4001, d2,d2,1, 0,d2-dm/9,1, 0,d2,1 REVOLVE NSP/3,360,0, GET(NSP) DEL 1 FOR k=1 TO 8 CUTEND NEXT k RETURN 106:!Pyramid$ MATERIAL 0 ADDz dm*2/3 CUTPLANE DEL 1 MATERIAL omat PYRAMID 5,dm,63, d2, d2,1, -d2, d2,1, -d2, -d2,1, d2, -d2,1, d2, d2,1 CUTEND ADDz dm*3/4 CUTPLANE 180 DEL 1 PYRAMID 5,dm,63, d2, d2,1, -d2, d2,1, -d2, -d2,1, d2, -d2,1, d2, d2,1 CUTEND RETURN

107:!Cone CONE dm,d2,0.001,90,90 RETURN 108:!Torus ROTy -90 PUT 0,d2/2,901, d2/4,360,4001 REVOLVE NSP/3,360,63, GET(NSP) DEL 1 RETURN 109:!TinCan PUT 0,0,913, d2,360,4013, d2*9/10,360,4013 PRISM_ NSP/3,dm, GET(NSP) CYLIND d2/10,d2*9/10 RETURN 110:!Big_Ell PUT -d2,0, -d2,dm, 0,dm, 0,d2, d2,d2, d2,0, -d2,0 PRISM NSP/2,dm, GET(NSP) RETURN

REVOLVE NSP/3, 360,0, GET(NSP) ROTy 90 CONE d2,d2/50, 0.001,90,90 DEL 3 RETURN 112:!Door Handle !Escutcheon PUT 0,0,913, 0,-d2/2,13, d2/2,-180,4013, d2,d2/2,13, d2,0,913, d2/2,-180,4013, 0,-d2/2,-1, !Keyhole d2, d2/20,15, d2/1.5, d2/20,13, d2/1.5,-d2/ 20,1013, d2, -d2/20,15, d2, d2/20,-1 PRISM_ NSP/3,d2/10, GET(NSP)

!Handle ROTz 90 CYLIND d2/2,d2/5 ADDz d2/2 ELBOW d2/3,90,d2/5 ADD d2/3,0,d2/3 111:!Dish ROTy 90 ROTz 180 CYLIND d2/2,d2/5 CONE d2,d2/6,d2/16,90,30 ADDz d2/2 DEL 1 ELBOW d2/3,90,d2/5 ADDz d2 DEL 5 ROTy -30 RETURN PUT 0, 0.001,1, d2,0.001,901, d2,-45,4001

User Interface Dialog – the straightforward approach


ERE is a typical page containing a number of parameter names and Edit boxes and Popup menus, using a simple XY method of locating the top left of each box. UI_DIALOG "User Interface Templates",310,266 UI_PAGE 1 !-------- SIMPLE VERSION --------------UI_STYLE 2,0 UI_GROUPBOX 'Object Configuration',4,24,302,180 UI_OUTFIELD 'Object Type', 12,48+5,160,24 UI_INFIELD 'objtyp', 160,48,140,24 UI_OUTFIELD 'Governing Dimension',12,72+5,160,24 UI_INFIELD 'dm', 160,72,140,24 UI_OUTFIELD 'Material of Object', 12,96+5,160,24 UI_INFIELD 'omat', 160,96,140,24 UI_OUTFIELD 'Pen Colour', 12,120+5,160,24 UI_INFIELD 'pcol', 160,120,36,24 UI_OUTFIELD 'Show Text label', 12,144+5,160,24 UI_INFIELD 'shotext',160,144,140,24 UI_PICT 'objgroup.tif', 5,205,300,30 UI_BUTTON UI_NEXT,'Next Page',180,238,126,24

If the User Interface Script has any working commands in it, the user will see an extra button in the settings box, like this. If your UI dialog has everything needed for the user, then you can hit the ‘Set as Default’ button to force it to come up when the library part is first opened. 2.68

This is Page 1 of the object called UI_Tester.gsm. The first page of an object’s UI should contain the primary user information such as shape and size. Note that OUTfields have to be 4-5 pixels higher than an INfield if the text is to line up.

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Command Statements in the User Interface (UI)


et’s remind you of the commands in the UI. For all of these:

• X and Y are the location of the Top Left point of the box or button. • Width and Height are the relative dimensions of the box or button from that top left corner to the Bottom Right corner. • All dimensions are in screen pixels. • Text expressions are either in quotes or can be a variable that contains a string of text.

UI_DIALOG • UI_DIALOG title [, sizex, sizey]

This starts off every UI script, stating that you want a UI, and defining its size. In normal object making this is fixed permanently at 310x266, but Graphisoft are leaving it open for the design of future interfaces of a different size – no longer having to fit into the existing objects dialog box.

x1, y1: x2, y2:



• UI_PAGE pagenum

• UI_PICT expression, x,y [,width,height]

You can have many pages in the UI, so they should be clearly numbered, starting from ‘1’. Everything after this command is on the page referred to until the next UI_PAGE statement. You can move between pages by making buttons for ‘Next’ or ‘Previous’ Page. Unfortunately, you cannot make buttons for all pages – you must move page by page. The GDL writer should write pages in the order of significance – ‘Main configuration’ first page, perhaps ‘Colours and materials’ after that, and perhaps ‘2D symbol and display’; and then finally you might want to add a page with ‘User instructions and information’.

You can bring a jpg or tif file from a loaded library and display it as a Picture element in the dialog box.

UI_BUTTON • UI_BUTTON type,text, x,y, width,height

You can make buttons to go to the Next Page or the Previous Page. (I hope that buttons will be available in future versions to do more.) type: UI_PREV: goto the previous page UI_NEXT: go to the next page

UI_GROUPBOX • UI_GROUPBOX text, x,y, width,height

Groupbox gives you a rectangular box around a group of smaller items, and it can be titled, as in the example here, ‘Object Configuration’. The words sit at the top of the Groupbox, and break the top line. If the text is ‘’ (nothing) the Groupbox is drawn cleanly without text.


A Separator is just a LINE that can be drawn in the box. The manual says that lines can ONLY be Horizontal or Vertical, but if you disobey this and define 2 XY locations with a diagonal relationship (as in RECT2) you may get a GroupBox that does not print a title. ©Copyright Marmalade 1998, 1999, 2000, 2001

Ha! The Holy Grail of the User Interface – The display is arranged in little tiled images of the contents of the Value List. This is done with the UI_OUTFIELD command.

starting point coordinates endpoint coordinates

expression: File name or index number of the picture, with its name in full, including 3-letter suffix. If you use an index number of zero (0), it will display the Preview picture of the library part, the advantage being that it doesn’t need to be in the loaded libraries. width, height: Width and height in pixels; the picture’s original width and height values will be used if you leave this blank. If you specify width and height, GDL will squeeze the picture to fit. It is always advisable to write the width and height, if not the UI is strangely ‘jumpy’ following parameter changes.

UI_STYLE • UI_STYLE fontsize,facecode

This gives you the choice of three font type/sizes and several styles. It uses existing system fonts, and you do not define an actual font by name – it would cause chaos in UI design if you could because the end user might not have that font. Using system fonts you can be sure it will work for the user. Fontsize: On the Mac, fontsize 0 (normal) uses 10point Geneva, fontsize 1 (small) uses 9-point Geneva and fontsize 2 (large) uses 12-point Chicago. PC users will have fonts of similar sizes like Arial. GDL writers of professional quality must check that their object’s usser interface fonts work correctly on Mac and PC. Facecode: similar to the STYLE definition in the GDL Manual, but the values cannot be used in combination. For this, 0=Normal, 1=Bold, 2=Italic, 4=Underline, 8=Outline, 16=Shadow. 2.69

The GDL Cookbook 3 – Voyager

UI_OUTFIELD • UI_OUTFIELD text, x,y, width,height

This allows you to write some text in the UI dialog, for example the description of a parameter, or some instruction to the user. We have all been frustrated by lack of space to describe parameters in the old box. Now you have the space to help your user. Maximum length of the text is 550 letters, so you can write a reasonable description. You can also write an IF statement that changes the text according to the answer. For example, the text could be displayed in English, French or whatever, and in my example (page 3), the text knows if the object selected is a Cube, a Cylinder or whatever, and tells the user how the object is made.

UI_INFIELD – the power command • UI_INFIELD “name”, x,y, width,height, versionFlag, pictName, nrImages, nrRows, cellX, cellY, imageX, imageY, imageExp1, text1, ..., imageExpn, textn]

This is where the real power of the UI is to be found! The UI_INFIELD can accept user data for Dimension, Text, Value Lists, Pen colour and all the usual things either in Edit fields or in Popup menus; but it can also display a Pictorial Value List (containing thumbnail images of your doors, windows or objects), making it vastly more user friendly. UI_INFIELD knows whether to show an Edit field or a Menu because you have created the parameters and defined their type in the main parameter box. If you are using the UI exclusively, then you could hide the parameters from the parameter box so that they are only visible in the UI. The example on the previous page shows a variety of UI_INFIELDs including Value list (text), Dimension, Material, Pen and Boolean. If as a result of your choice, other things change (e.g if user selects a circular object, you need to ask the user questions about diameter, and if user selects a polygonal one, you need to ask about sides) then the Interface script is re-read and the current page is rebuilt – it causes a slightly annoying delay, but when you know why it is doing it, you can live with it. name: Parameter name (defined in the parameter settings) x, y: The position of the edit text, popup or control width, height: width and height in pixels That is all you need for normal Edit field or Pop down INFIELDs. If you wish for a Pictorial ValueList, you need to have defined the ValueList first, and then you need the following: versionFlag: Reserved, so for now, always put 1 in there. pictName: Name of the image file (jpg or tif) containing a gridded arrangement (matrix) of images (as described earlier), in the order in which you want them to be seen. nrImages: Total number of images in the matrix nrRows: Number of rows of the matrix 2.70

Fonts Display and IF statement: Page 3 shows the variety of Fonts and Styles available. Use the font size selector to change the block of text (about Programming) to see how the font size changes and affects the appearance of the page. If text flows out beyond the limits defined by Width and Height, it simply gets lost.

IN_FIELD Leading (vertical space between lines) – Page 4 of the UI_tester demonstrates this effectively. You can change the fontsize and the whole page is reformatted with a different value for Leading.

From ‘nrImages’ and ‘nrRows’, GDL works out the arrangement and will cut the image of the matrix up into equal tiles and use them in order from top left to bottom right. cellX, cellY: Width and height of a cell as you wish them to be seen within the Pictorial ValueList field, including the image – and the text which must fit the space, of course. imageX, imageY: Width and height of the image tile that is to be fitted into the Cell – this must be smaller than the CellX and CellY or there will not be space for the text. Now you follow with a list of the index numbers and names of each image tile, in the same order – from top left to bottom right. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

imageExpi: index number of the i-th image tile in the matrix, starting with 1. texti: text name in the i-th cell. For example:- 1,’Cube’,2,’Cylinder’,3,’Sphere’ and so on. Well that sort-of explains it (in slightly more words than in the manual) but you will find on these pages a detailed description of the process, and of course you have UI_Tester.gsm to play with and examine until you get the hang of it. Write a User’s Manual! – Page 5 demonstrates how you could use the UI to write a user’s manual for your object, or insert a copyright notice or manufacturer’s address and email. Remember that the maximum letters in one OUTfield is 550.

You want a Pictorial Value List?


HE first step to making a user interface that incor porates a Pictorial Values List is to generate all the 3D or Rendered views of your object or objects. Put them into Photoshop (or similar) and arrange them in a very orderly grid. The graphic matrix in this example is 270x360 pixels so that the objects are perfectly arranged in 4 rows across of 3 across, with 90x90 pixels each. Set your ArchiCAD rendering window to 90x90 and patiently produce, then copy and paste each image into one file. The grid does not have to be in the same arrangement as it will be seen in the dialog box, but it helps enormously in composition if you arrange it as you wish the user to see it. You could make the original image larger, to give you space to move the tiles about, and then re-pixellate down to the final size. Apply a sharpen filter on the final image. The order of the tiles should match the sequence of choices in the Value list, and the same order must be applied in the list of indexes in the UI_INFIELD statement. The tiled image should be kept in the same library folder as your Macros.

Pictorial Value list guidelines • Order – In a typical UI page, write all the other parameters statement first before you write the code for a PVL. • Field sizing – When you have a Picture list that contains more images that can fit in the window at once, a scroll bar of 19 pixels width will appear at the right hand side. The practical usable area with a scroll bar has a maximum width of 279 which allows five cells of 52 each, four cells of 65 each, three cells of 86 each, or two of 130 each (taking into account the 19 pixel edge width). The Pictorial Value lists in GS’s single leaf doors use 4 cells of 65 width each. Practical field height is 210, so a cell should be 102-105 for the images to appear cleanly. Try to make your Photoshop file the same width as the field of cells, otherwise GDL has to stretch or squeeze the image tiles to fit the space allotted – and this can result in distortions or unexpected aliasing. • File format – Although TIFs always work well, you can safely use TIFs with LZW compression, or JPEGs. • Cell sizes – The Cell height MUST be at least 22 pixels higher than the Imagetile or the text will be omitted. Cell size must be at least 4 pixels higher than the Imagetile. • Complete the list – If the item in the Value list is omitted from the list in the UI_OUTFIELD command, the item will be omitted from the Pictorial Value list. The new look of Library objects with a UI ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

UI Design Guide Some golden rules, warnings, advice and notes • Preview – As you build the Interface script, you can keep clicking on the Preview button to see how it is going. If you have made a mistake, you usually get a blank grey UI dialog box. Do not panic, check through your script for errors. • UI_Box size – because the box has a surround line, the realistic design size is 308x264 pixels, not 310x266. • Long texts – in the UI_OUTfield, text blocks work out their own wordwrap on a Lefthand justified basis and if the text (with your choice of font and style) exceeds the box size, it just gets lost. The text all has to be written on one line in the GDL Interface script window (which is difficult), and has an absolute limit of 550 letters (or bytes). • Leading – (the distance between lines of text) is very important, as it has to work with the INfield boxes which have their own leading. If you do not get Leading right, your UI dialogs will look untidy, and you will have to use trial and error. I have done research into leadings for OUTfields and INfields, to save you hours of guesswork. For OUTfields, the inbuilt leading of a continuous flow of text is 13 pixels for fontsize 0, 12 pixels for fontsize 1 and 16 pixels for fontsize 2. For INfields, the edit boxes set themselves, and seem have a default height of 20 pixels high for size 0, 15 high for fontsize 1, and 23 pixels high for fontsize 2, regardless of what you set height to. My recommended minimum Leading for INfield boxes is 4 pixels more than the height, i.e. 24 for f’size 0, 19 for f’size 1, and 27 for f’size 2. INfield boxes have shadows round them, to simulate a hole for Edit fields and a button for Popup menu fields (which are included in the Leading figures given here). For this reason, Popups look 2 pixels longer than Edit fields of identical size, so you could artificially shorten them. INfield boxes do very wierd things if you do not get leading and height right according to the numbers above. If you set the Height to less than the above figures for whichever font, they have their own mind. The rule they follow is: Go to the XY location required; Measure downwards the silly height that in in the script; then measure UPwards the height that the INfield box ought to be. Result is that they appear higher than you wanted. • DPI issues – Mac screens are different to PC and you need to program the UI on both machines to be sure they work. Infields may not line up with Outfields and UI_Picts and scrolling value lists may look quite different! Programming on a Mac first is the easiest, and then tweak it for the PC if necessary. 2.72

• Lining up Fields – INfield boxes place the text in the centre of the box vertically and left justified horizontally, whereas text in an OUTfield sits lower in its rectangle. Therefore, if you wish the text of an OUTfield box to line up with text in an INfield, then the XY start of the OUTfield has to be 4-5 pixels higher than the INfield.(I say ‘4-5’ not ‘4 or 5’ because it is inconsistent) • Hide Parameters? – if you depend entirely on the UI, then you still need to make the parameters in the parameter settings box, but you may (as in my example) have a parameter that only has relevance to the UI dialogs; so for that one, you need to click on the ‘Hide Parameter’ button so that the user does not get confused. • Lock Parameters – some parameters only refer to certain conditions – for example if the object is circular, then there are questions about diameter and surface smoothness. If the object is polygonal, there are questions about edges – so the smoothness questions should be locked. You cannot dynamically Hide a parameter, so the next best thing is to Lock it. You can use the LOCK command (in the Parameter Script) to lock out parameters that are not relevant to the user’s choice. In the UI, you can have alternative Pages (using a long IF statement) depending on the user’s choice of object. • Indents – (X value in boxes and fields) should be 12 if you want it to line up with the Title of the dialog box; if you use a Groupbox, the relative indent will still be 12. So you should indent OUTfields to 12+the indent of the Groupbox, and the texts will line up with the Groupbox title. • PEN – Best width for a PEN INfield is 36 – this will give you a nice square palette box. • Buttons – (for Next and Previous pages) are always in fontsize 2 (large) so you need to allow for this. Minimum height for a button is 20 high, 24-26 is safe and good looking. The button should float about 2 pixels clear of the boundary at the bottom, so I recommend a maximum Y value of 238 for buttons 24 high. Instead of writing Next and Previous, you can write the titles or descriptions of the next or previous pages. • Warning! – Use the UI Preview button to see how your box is looking, but on no account use the actual fields to change parameters. They may not work, but worse, they may crash your ArchiCAD, and even worse, they may case the script to be erased. Web Plug in – If *any* UI commands are used, the Web Plug in will always default to view the UI first, even if the ‘set as default’ button has not been pressed.

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

User Interface – all the bells and whistles

UI_DIALOG "User Interface Templates",310,266

UI_PAGE 1 !----------------------------------------UI_STYLE 2,0 led=24 !Leading of Infield Boxes dy =0 !Distance downwards in Y dy=dy+led UI_GROUPBOX 'Object Configuration',4,dy,302,led*7.5 dy=dy+led UI_OUTFIELD 'Object Type',12,dy+5,160,24 UI_INFIELD 'objtyp',160,dy,140,24 dy=dy+led UI_OUTFIELD 'Governing Dimension',12,dy+5,160,24 UI_INFIELD 'dm',160,dy,140,24 dy=dy+led Here, I have used variables called ‘led’ UI_OUTFIELD 'Material of Object',12,dy+5,160,24 and ‘dy’ so that I can experiment with difUI_INFIELD 'omat',160,dy,140,24 ferent Leadings. As there are 5 pages, an dy=dy+led UI_OUTFIELD 'Pen Colour',12,dy+5,160,24 OUTfield in small font tells the user what the UI_INFIELD 'pcol',160,dy,36,24 other pages contain. The UI_PICT will squash dy=dy+led down to the specified size 300x30, but if you UI_OUTFIELD 'Show Text label',12,dy+5,160,24 UI_INFIELD 'shotext',160,dy,140,24 make it that size first, there is less distortion dy=dy+led and quicker display. UI_STYLE 1,0 UI_OUTFIELD 'Page 1:Object config; Page 2:Pictorial Values list;', 12,dy, 290,16 UI_OUTFIELD 'Page 3:Fonts display; Page 4:Infield leading; Page 5:Explanation',12,dy+16,290,16


UI_PICT 'objgroup.tif',5,205,300,30 UI_BUTTON UI_NEXT,'Pictorial Selector',180,238,126,24

UI_PAGE 2 !-----------------------------------------UI_STYLE 2,0 UI_OUTFIELD 'Pictorial Selector',10,25,200,25 UI_INFIELD 'objtyp',4,20,300,210, 1,'objselector.jpg',12,4, 92,102, 80,80, 1,'Cube', 2,'Cylinder', 3,'Sphere', 4,'Capsule', 5,'Dome', 6,'Pyramid', 7,'Cone', 8,'Torus', 9,'Tincan', 10,'Big_Ell', 11,'Dish', 12,'Handle' UI_BUTTON UI_NEXT,'Font display', 180,238,126,24 UI_BUTTON UI_PREV,'Object Config', 3,238,126,24

2 2D script Whatever you make, however clever, it will still only be a little blob in your floor plan unless you make a 2D script!

!User Interface Demo !2D Script PEN pcol PROJECT2 3,270,2 HOTSPOT2 0,0 IF shotext THEN DEFINE STYLE 'otxt' 'Arial', (dm/6)*1000/A_,5,0 SET STYLE 'otxt' TEXT2 0,0,objtyp ENDIF

©Copyright Marmalade 1998, 1999, 2000, 2001

When you get it right, it is amazing how short the script needs to be!

Turning Pages in the UI


T the moment, you have to go through pages in sequence. It would be great if you could select the page you wanted to go to directly: e.g. ‘2D Settings’, ‘Materials’, ‘Options and Info’, and so on. There is an Appendix to the Cookbook which illustrates a technique to overcome this missing feature.


The GDL Cookbook 3 – Voyager

UI_PAGE 3 !-----------------------------------------IF objtyp='Cube' THEN odstr='Use a cubic PRISM' IF objtyp='Cylinder' THEN odstr='Make with CYLIND' IF objtyp='Sphere' THEN odstr='Make it with SPHERE' IF objtyp='Capsule' THEN odstr='Use CYLIND + ELLIPS' IF objtyp='Dome' THEN odstr='Use REVOLVE+CUTPOLYA' IF objtyp='Pyramid' THEN odstr='Easy! Use PYRAMID!' IF objtyp='Cone' THEN odstr='Easy! Make with CONE' IF objtyp='Torus' THEN odstr='REVOLVE a circle' IF objtyp='Tincan' THEN odstr='Circular hollow PRISM' IF objtyp='Big_Ell' THEN odstr='Make it with a PRISM' IF objtyp='Dish' THEN odstr='Use CONE and REVOLVE' IF objtyp='Handle' THEN odstr='Use PRISM, CYLIND, ELBOW' spa=16 !Pixels per line for text textstring1='Your object is a '+objtyp UI_STYLE 2,0 !title of page UI_OUTFIELD 'Font display',4,16+5,150,24 UI_SEPARATOR 4,38,300,38 !Display of random sizes + styles FOR k=44 TO 210 STEP spa*2 UI_STYLE INT(RND(3)),INT(RND(5)) UI_OUTFIELD textstring1,4,k,156,spa UI_STYLE INT(RND(3)),INT(RND(5)) UI_OUTFIELD odstr,4,k+spa,156,spa NEXT k !Long Text block with Font selection UI_STYLE 0,1 !select font size for text UI_OUTFIELD 'Font size below>',160,16+5,99,20 UI_INFIELD 'fontui',260,16,46,20 x=SPLIT(fontui,'%n',fntui) UI_STYLE fntui,0 UI_OUTFIELD 'Programming – A program is just a sequence of instructions. You can read instructions to someone over the telephone, you can struggle through the instructions for setting the controls on your new video. Thats a program!',160,44,148,180 UI_BUTTON UI_NEXT, 'INFIELD leading',180,238,126,24 UI_BUTTON UI_PREV, 'Pictorial Selector', 3,238,126,24


This page displays a variety of font sizes and styles (using random numbers) and shows how an IF statement can be used to change the contents of the dialog box. As ‘fontui’ for the font size is only used in the UI boxes, it remains hidden in the parameter box. This also demonstrates that you can use a FOR... NEXT loop in the UI, once you have worked out line spacing etc. IF statements and Loops can be risky in UI scripts (instability, risk of crash etc) so do it to a copy of your file.

UI_PAGE 4 !------------------------------------------UI_STYLE 2,0 !Title of page UI_OUTFIELD 'INFIELD Leading',4,16+5,150,22 UI_OUTFIELD 'Font size below>',130,16+5,99,22 UI_INFIELD 'fontui',215,16,90,24 x=SPLIT(fontui,'%n',fntui) UI_STYLE fntui,0 IF fntui=0 THEN spa=24 !Pixels per line for INFIELD IF fntui=1 THEN spa=19 !Pixels per line for INFIELD IF fntui=2 THEN spa=27 !Pixels per line for INFIELD leding="Leading="+STR(spa,2,0) !print string in box UI_SEPARATOR 4,40,300,40 FOR k=45 TO 210 STEP spa UI_OUTFIELD 'Infield size',4,k+5,124,spa UI_OUTFIELD leding,215,k+5,90,spa UI_INFIELD 'dm',130,k,80,spa NEXT k UI_BUTTON UI_NEXT, 'Explanation',180,238,126,24 UI_BUTTON UI_PREV, 'Font leading',3,238,126,24

Visual GDL and coloured script


isual GDL was abandoned as a product at the end of the life of AC5. Pity… It was over priced and difficult to get hold of, but it did allow solid modelling which converted into scripts. Many of us (GDL users) wish that Graphisoft would bring back a good feature of VGDL, which was coloured script. Commands one colour, comments another, variables and numerals another – it is common to other languages like C++, and helps the programmer in both writing and debugging.



Note that by using the SPLIT com mand, one can avoid several lines of IF statements to parse Value list of font sizes. When you change the font size, the box is reformatted to demonstrate the importance of Leading. Long texts have to be written till they hit the extreme right hand end of the script window – maximum 550 letters!

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager UI_PAGE 5 !-------------------------------------------Getting started with the User Interface UI_STYLE 2,0 UI_OUTFIELD 'Explanation of the UI_exercise', 12,20,290,24 is a bit painful, but in some ways, it’s UI_STYLE 0,0 just another form of 2D scripting, and gets UI_OUTFIELD 'The first page was a typical page that you easier as you do more of it. You also find might use to replace the normal parameters box.', 12,36,290,28 that your vocabulary of things-you-can-doUI_OUTFIELD 'The second page was a demonstration of a with-UI gets more sophisticated as you do Pictorial Values List, e.g. for a Door library.', more of them. 12,68,290,28 UI_OUTFIELD 'The third page was a demonstration of ways of defining fonts and styles. Try changing the font. It also demonstrates IF statements in the User interface', 12,100,290,42 UI_OUTFIELD 'The fourth page demonstrated the different leadings of INFIELD boxes for different fonts. Leading is the space between successive lines of type.', 12,146,290,42 UI_OUTFIELD 'The fifth page demonstrated how you can use a page of the User Interface to provide a detailed users manual.', 12,192,290,28 UI_STYLE 0,1 UI_OUTFIELD 'Good luck with your attempts to build the User Interface!',160,220,140,42 UI_BUTTON UI_PREV,"INFIELD leading",3,238,126,24


Mental Health Warning!


LTHOUGH I have used IF-statements (and so do Graphisoft in the manual), DO NOT USE IF-statements in the UI script unless strictly to do with UI matters. IF-statements regarding parameters can result in a crash in which half or more of the parameters delete themselves, and the ones which are left change to values of zero or near-infinity. Parameter changes and error checks can be made in the PARAMETERS script. Although the guidelines here are meant to make it easier, you still need a paper and pen and a lot of trial and error to get the UI just right. Build ALL the parameters you are going to want first before you design or build the UI; adding latecomers to the UI is a painful nuisance. And after you have saved graphics for use in the UI, don’t forget to reload libraries. When you Preview the UI, do not use it to alter parameters! This causes a crash. If you wish to change a parameter, go back to the parameter box. If you wish to test a UI dialog, do it by saving and alter the settings in the normal ArchiCAD environment.

Laurent’s Advice on UI by Laurent Godel 1. Smart page turning: forget UI_PREV and UI_NEXT, try to use the one dialog with a variety of ways of building it using check boxes, pull down menu, or (best of all) PVL. (See appendix in Cookbook 3) 2. Avoid jumpiness: fully specify UI_PICT statements, and put PVL coding at the end of a page building routine. 3. Reduce the use of OUTFIELDs if this can be done with Graphics (although these need lots of little graphics to be in the loaded libraries) – reduces difficulties of translation/localisation. 4. Follow the structured programming philosophy of the Cookbook!

GDL and PDF combine? Adobe's Acrobat and its WONDERFUL pdf format are on their way to becoming a worldwide standard for electronic publishing. Is it indeed silly to dream there could be a GDL plugin for Acrobat Reader? Acrobat now supports anything bi-dimensional- text, pictures, movies, sound (2D sound?), but no 3D. The plugin could behave much like the one for web browsers, showing objects in 3D directly inside the reader window. ©Copyright Marmalade 1998, 1999, 2000, 2001

Fire Extinguisher revisited: Materials and Interface (next page) !Fire Extinguisher 3D !Discovery and Voyager !Bottle Body MATERIAL 'fxmat' PEN pcol RESOL 16 ROTy -90 REVOLVE 4,360,63, 0 ,d/2,1, zzyzx-0.06,d/2,1, zzyzx ,d/6,1001, zzyzx ,0.00,1 DEL 1 !Handle MATERIAL 'hanmat' RESOL 8 ADDz zzyzx CYLIND 0.03,0.03 ADD -0.03,0,0.06 ROTy -110 MATERIAL 'nozmat' CYLIND 0.05,0.01 DEL 2 ADDz 0.03 ROTx 90 ADDz -0.02 MATERIAL 'hanmat' PRISM_ 9,0.04, -0.03,0,15, -0.04,0.05,15, 0.11,0.10,15-2, 0.12,0.09,1015, 0.03,0.05,15, 0.12,0.01,15, 0.12,0.00,15, 0.03,0.03,15, 0.03,0.00,15 DEL 4

3D Script There are few changes to the 3D script, except to insert the new material commands for hanmat and nozmat. 2.75

The GDL Cookbook 3 – Voyager

Fire Extinguisher revisited: UI T

HIS Fire Extinguisher may be a humble object in deed, but it is an excellent vehicle for GDL teaching. In a more sophisticated model, you want a User interface and more control over materials. This object contains: • A good way to define a new material from a pen colour • Easy User Interface script

VALUES 'fxtype' 'Water','Halon', 'Powder','Foam', 'CO2','Free colour'

Update the Parameters box. Make the main type selector Bold because that is the most important selection criterion. Add a new pen parameter and update the Value list to include the free choice of colour. Remove hcol for the handle – we will define a new material. Previously, we used Pen colour to define the material for the handle, by making material value to zero. The REQUEST technique used here in the Master script is far more effective.

Make the tiled images Before making any visual user interface, you have to dump a series of images into a photoshop file and organise them into tiles. this graphic is 278x458 pixels – enough for three images to show at once.

!Fire Extinguisher !PROJECT2 3,270,2 ARC2 0,0,d/2,15,345 CIRCLE2 0,0,0.03 RECT2 -0.04,0.02, 0.12,-0.02

Update the 2D script to hide the label if the user makes a free choice (they can label it themself).

IF fxtype<>'Free colour' THEN IF fsize>0 THEN DEFINE STYLE "ftext" Arial,fsize,2,0 SET STYLE "ftext" TEXT2 0,0,fxtype ENDIF ENDIF

See previous page for the 3D Script UI_DIALOG 'Fire Extinguisher types' UI_INFIELD 'fxtype',20,16,272,245, 1,'firex_ui.tif',6,2, 82,230,70,210, You may have to do some tweaking of 1,'Water', the numbers in the Infield command 2,'Halon', before it finally works. Before you get 3,'Powder', a result, remember to ‘Reload 4,'Foam', 5,'CO2', Libraries’ after you have saved the 6,'Free colour' tiled image.

!Master Script This routine is IF fxtype="Water" THEN incredibly useful. pred=0.6:pgrn=0.0:pblu=0.0 The user specifies a ENDIF PEN colour and the IF fxtype="Halon" THEN pred=0.0:pgrn=0.6:pblu=0.0 REQUEST command breaks the pen into ENDIF Red, Green and IF fxtype="Powder" THEN Blue and makes a pred=0.0:pgrn=0.0:pblu=0.6 ENDIF new Material from it. The ‘plastic’ IF fxtype="Foam" THEN pred=1.0:pgrn=1.0:pblu=1.0 material type 4 is the ENDIF most useful for material making IF fxtype="CO2" THEN (‘metallic’ is too pred=0.0:pgrn=0.0:pblu=0.0 ENDIF dark). IF fxtype='Free colour' THEN PEN bcol x=REQUEST("Rgb_of_pen",bcol,pred,pgrn,pblu) ENDIF Define two new DEFINE MATERIAL 'fxmat' 4, materials for the pred,pgrn,pblu Nozzle and the DEFINE MATERIAL 'nozmat' 4, Handle to make 0.8,0.8,0.8 sure they are the DEFINE MATERIAL 'hanmat' 4, 0.1,0.1,0.1 right colour.

BUG! Do not test the Value List in the Preview window of the UI or you may delete parameters and your object.


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Let’s make a Door!

Exercise and case study

This door is the most comprehensive exercise in the GDL Cookbook. It looks at: • WALLHOLE command • TUBE command • PUT & GET used extensively • PRISM with holes drilled • Macro calling – doors and handles • 2D scripting, including scale-sensitivity • The secrets of flipping/rotating door in wall • User Interface and Pictorial Value List


OORS are plentifully available in the ArchiCAD Library and on object sales on the Internet, but you still need to know the secrets behind doors in case you have to make one. You may be surprised to find that they are much more difficult than windows. This is mainly because they can rotate and flip and present different opening options than windows. They are more likely to be calling macros because of the many possible styles in one frame and the ironmongery. The door in the OMWAC should be studied first as this is very simple. A more sophisticated door will include issues of a user interface, macros, capability of being flipped and rotated, a variety of door styles, different rotating angles and scale sensitive representation. All of these are tackled in this example.

Rules of doors Remember, the primary rule about doors and windows is that they should be built flat on the floor, and that the floor surface – the XY plane – represents the external face of the wall that the window/door will fit into. ‘A’ represents the width of the door and ‘B’ will be the height of the door – when it is upright in a Wall. The hole in the wall can be cut automatically as a rectangle of width A and height B, but it is better to issue a WALLHOLE command and be in control of jamb materials and to retain the option to make arched or complex openings. From ArchiCAD, select from the File menu>New Library Part> Door. (You can build the door as an Object first and transform into a Door later.)

Parameters The parameters here follow Graphisoft’s list of recommended parameter names. These are recently published in their professional guidelines (downloadable from the Graphisoft website). The parameters are added in as you need them. The frame is part of the door script, but the doors and the handles are best built as Macro objects, so that they could be used in other types of door assembly, e.g. double doors, doors with porchframes, doors with curved fanlights above, etc. Any quality object with more than 5 parameters should be grouped with cascading organisation, as shown here. ©Copyright Marmalade 1998, 1999, 2000, 2001

A cascaded parameter box turns into this tidy little result

Organisation The door could be made as an integrated whole, but it would be very complicated, and would require a lot of copying and pasting and reorganisation if you decided to do the same for a double door set or one with curved fanlights. Using Macro objects for the common objects means that the primary door object is concerned solely with the Frame, Opening shape and User interface. This requires more typing now, but less work in the long run. The macro objects can be stored tidily in their own folders.



The Wallhole, Doorframe, Parameter organisation and User interface – calls the leaf and door-handle macros

Bit map image of doors arranged in tiles

Door leaf

Door handle

Several varieties of door stored as macro objects

Several varieties of handle stored as macro objects


The GDL Cookbook 3 – Voyager

3D Script The primary purpose of the door object is the opening and frame so these get done first. The Wallhole is not really necessary but it’s here for two reasons – it allows you to control the colour of the jamb (reveal) where the wall is cut, and it demonstrates the easy syntax of WALLHOLE. This use of TUBE for the door frame is important if you want to have features like a rebate in 3d and to adapt it for circular or gothic door heads. This method of building a TUBE is a classic. Copy the idea and use it for all tubes. First, it outlins the frame profile with a long PUT statement, then stores the number of points in a variable profpts. Then the next PUT statement lists the XYZT locations (not forgetting the phantom points) and records the number of points in another variable pathpts. The TUBE command itself is now incredible simple, it’s one line that cannot cause an error because your variables have counted the points correctly. Just use BODY -1 either side of the TUBE to prevent a rendering error by ArchiCAD.

If you were a manufacturer you might make the opening sizes ‘snap’ to the known dimensions of your door range, or you could allow the opening to be stretchy but adapt the width of the frame. This is a design and manufacturing decision; whatever you decide to do is easy enough in GDL.

!Example Door, using Tube !and Prism: Voyager !3D Script PEN pcol Note that at this level it !Wallhole makes sense to use PUT MATERIAL jmat and GET for all forms – PUT A/2,-B,15, this avoids annoying A/2, 0,15, error messages when A/2, B,15, you get the profiles -A/2, B,15, slightly wrong. -A/2, 0,15, -A/2, -B,-1 WALLHOLE NSP/3,2,GET(NSP) IF dort=0 THEN END:!No door !Frame MATERIAL frmat PUT 0,0,0, 0,frt,0, There are three frw+0.01,frt,0, numbers for each frw+0.01,lt,0, point on the frw,lt,0, profile. frw,0,0, 0,0,0 There are four profpts=NSP/3 numbers for each PUT A/2,-B,0,0, point on the A/2, 0,0,0, pathway. A/2, B,0,0, -A/2, B,0,0, -A/2, 0,0,0, -A/2, -B,0,0 pathpts=(NSP-profpts*3)/4 BODY -1 TUBE profpts,pathpts,63,GET(NSP) BODY -1 VALUES 'ls' 'Empty','Flush', '1-panel','2-panel', '3-panel_a','3-panel_b', '4-panel','Circular'

The Values list in the Parameter script

Now make the door – make a macro! Work out how many door types you will want in this frame. Include an empty frame (as a courtesy to your user). Since you will want to make a pictorial value list, try to make enough doors to make a grid of little images, perhaps 4 across and 2 down (8 doors) or 3 across and 4 down (12 doors) – depends on the size of the doors. It’s useful to think ahead. This is an image of the final set of doors, with a variety of glazing/panelling options. When the door is finished, you should make a picture file like this. Now for the actual doors. We make them elsewhere as Macro Objects. GS advise that macro objects are better than writing just a macro script, because you have the pleasure of writing a complete working object, with its own little set of parameters, a preview window and even a temporary 2D script so that you can build up an ArchiCAD file to view and organise your macro objects. Each filetype has its own naming conventions and icons, and must be in loaded libraries. For this Door to work, you need the main object, the photoshop file of all the doors, the doorleaf and doorhandle macros all to be in loaded libraries – which is why I generally prefer to make objects fully integrated except in the case of manufactured products. 2.78

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Making the Door-leaf Macro Object For an easy life, use the same parameter names as you used in the main door file. Make the door flat on the floor. On the CD with the Cookbook, there are 6 such files; here is the one with a single panel (glazed or solid). Once you have made one door, you can duplicate the macro objects, rename them, and then adapt each one’s 3D script to reflect the correct number of panes. This way, the work of writing in all the parameter titles is a once only. The hole in the prism has exactly the same XY list as the glass that fits it, so by using PUT, you can economise – write it once for the door, then copy and paste for the glass.

!Main Leaf – Macro Object MATERIAL lmat1 lfr=lw/6 PUT 0,0,15, 0,lh,15, -lw,lh,15, -lw,0,15, 0,0,-1 PUT -lfr,lh/3,15, -lfr,lh-lfr,15, -lw+lfr,lh-lfr,15, -lw+lfr,lh/3,15, -lfr,lh/3,-1 PRISM_ NSP/3,lt,GET(NSP) !Panel or Glass The hole and ADDz lt/4 the glass have MATERIAL lmat2 the same XY list PUT -lfr,lh/3,15, -lfr,lh-lfr,15, -lw+lfr,lh-lfr,15, -lw+lfr,lh/3,15, -lfr,lh/3,-1 PRISM_ NSP/3,lt/4,GET(NSP) DEL 1

Macro Object 3D Script Macro Object Parameter box, and the door leaf !Example Door, using Tube !and Prism: Voyager !Master Script

Master Script Now you write in the error checking routine and the Value list parsing routines. The size of the door is worked out from the frame (this door is stretchy – remember that if your client has fixed door sizes then you might have to make the opening sized ‘snap’ to preset sizes). The opening angles need to be limited to a normal sweep. You could write a similar argument for the 2D opening angle. The value list result is converted into a FLAG, called dort.

3D script again

!Door parameters lw=A-2*frw !Leaf width lh=B-frw !Leaf height !Error Checking IF opa3>90 THEN opa3=90 IF opa3<0 THEN opa3=0 !Value List parsing IF ls='Empty' THEN IF ls='Flush' THEN IF ls='1-panel' THEN IF ls='2-panel' THEN IF ls='3-panel_a' THEN IF ls='3-panel_b' THEN IF ls='4-panel' THEN IF ls='Circular' THEN

dort=0 dort=1 dort=2 dort=3 dort=4 dort=5 dort=6 dort=7

The flags enable one to use a series of subroutines whose numbers are based on the flags. the single command GOSUB 200+dort will produce all of those doors! Very economical! The door needs to hinge off one frame. It is a houserule in GDL that doors hinge off the right hand frame un- !3D Script continued 202:!1-panel CALL dor01_macro65 PARAMETERS lmat1=lmat1, less they are mirrored. For !from previous panel lmat2=lmat2,lw=lw,lh=lh,lt=lt the door to hinge correctly, RETURN !Door you must move the 3D cur- ADDx lw/2 203:!2-panel sor to the right hand frame ROTy -opa3 CALL dor02_macro65 PARAMETERS lmat1=lmat1, lmat2=lmat2,lw=lw,lh=lh,lt=lt and build the door from GOSUB 200+dort DEL 2 RETURN that point. Rotate the door 204:!3-panel by the opening angle DEL TOP CALL dor03_macro65 PARAMETERS lmat1=lmat1, opa3, and gosub that door. END:!___________________ lmat2=lmat2,lw=lw,lh=lh,lt=lt RETURN The first value is empty 200:!Empty Space 205:!3-panel_a door opening, so 200 does !Nothing to do CALL dor03b_macro65 PARAMETERS lmat1=lmat1, RETURN nothing. 201 is a flush lmat2=lmat2,lw=lw,lh=lh,lt=lt RETURN door, so it is built within 201:!Flush Door 206:!'4-panel the main door object, not MATERIAL lmat1 PUT 0,0,15, CALL dor04_macro65 PARAMETERS lmat1=lmat1, called from a macro. This 0,lh,15, lmat2=lmat2,lw=lw,lh=lh,lt=lt is the prototype for all the -lw,lh,15, RETURN -lw,0,15, macros which are similar, 207:!'Circular 0,0,-1 CALL dorc_macro65 PARAMETERS lmat1=lmat1, but all have glazing panels. PRISM_ NSP/3,lt,GET(NSP) lmat2=lmat2,lw=lw,lh=lh,lt=lt The remaining subrou- RETURN RETURN tines are all identical apart The parameters here have all the same names in the Macro objects – the doors. In this case, from different labels and you could write ‘CALL dorc_macro65 PARAMETERS’. But there will be cases where the names differ, so you are being shown the ‘pukka’ method ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

the different file names of the macros. By using the same variable names, it is extremely easy to write the CALL. We do not use A and B in the macros, so these can be left out of the CALL statement.

The Door needs a 2D symbol Before you can place it in the ArchiCAD environment, you need to give the door a 2D symbol. Firstly, it is easiest to use the Project2 command to generate the symbol. The syntax of Project2 is PROJECT2 view_type, camera_angle, drawing_method. This works fine until you flip or rotate the door. However, this is lazy and as you will see below, can result in completely erroneous symbols. You would be better off with a smart 2D script that is scale sensitive and shows the door swing correctly with a selectable pen colour. It is also good to draw the door frames with a white fill pattern instead of the wireline effect you get with Project2. Add a white fill definition to the Master script, and draw the frame out using POLY2. The door leaf and the door handle are both scale sensitive, using A_.

The difficult bit Doors can be rotated (Cmd-E or Ctrl-E) or they can be flipped in the settings box. The interactions between these is a nightmare to solve, and when these also cause the 2D symbol to go awry, you finish up with doors that are in the right place in plan, but in a quite different place in 3D, perhaps with the frame outside the wall altogether. This interaction took me many hours to work out even with the help of GS’s GDL Technical standards, and you are lucky to be reading this and saving yourself all those hours. Using the PROJECT2, I have not been able to find a way of making all these flipping and rotating interactions work; the only solution seems to be a properly scripted 2D symbol, with the flipping routine included. The 3D and the 2D need to work together. Add this small group of lines to the 3D script after the ‘IF dort=0’ statement. !Add this to 3D script IF dort=0 THEN END:!No door IF E~ THEN !Flipping routine MULz -1 ADDz -frt+C_ ENDIF !.... script continues !as on earlier page

Make sure the door works If you haven’t already saved, you should have done long ago. The door will be saved as a .DOR file. If perchance you built the door as a .GSM object file, go to Filemenu>OpenLibrary Part>Open Object as Door, and then save; it will now be saved as a door.

ROT2 180 PROJECT2 4,90,1 DEL 1

Preliminary 2D symbol script This has been explained in earlier window exercises !Definitions DEFINE FILL 'nofill' 0,0,0,0,0,0,0,0, 0,0,0

Add this to the Master script !Example Door: Voyager !2D Script Pen colour for 2D PEN pen2d IF E~ THEN !Flipping This is the answer to MUL2 1,-1 the ‘difficult bit’: ADD2 0,-frt ENDIF E~ tells GDL if the door has been flipped !ROT2 180 !PROJECT2 4,90,1 Keep the Project2 routine !DEL 1 for quick reference SET FILL 'nofill' Set the fill pattern for the !Frame door frames ADD2 A/2,0 PUT 0,0, Draw out the frame, in the 0,-frt, negative quadrant -frw-0.01,-frt, (tracing over a Project 2 -frw-0.01,-lt, -frw,-lt, image). Using PUT, it is -frw,0, easy to draw it first as a 0,0 rectangle and fit the POLY2 NSP/2,7,GET(NSP) rebate later DEL 1 MUL2 -1,1 You can write the other ADD2 A/2,0 one, but it’s easier to do a PUT 0,0, 0,-frt, MUL2 and copy-paste the -frw-0.01,-frt, one you just did -frw-0.01,-lt, You could write -frw,-lt, GLOB_SCALE instead of -frw,0, 0,0 A_ if you are quick at POLY2 NSP/2,7,GET(NSP) typing. DEL 2 !Door ADD2 A/2-frw,0 The door leaf is also a ROT2 -op2 Poly2 if the scale is larger IF A_<51 THEN than 1/50 or 1/2”-1’, and POLY2 5,7, a simple Line2 if the scale 0,0, is 1/100 or 1/4”-1’ or 0,-lt, smaller. A_ is the global -lw,-lt, -lw,0, variable that decides. 0,0 The Handle is also a line2 ELSE that goes through the door LINE2 0,0,-lw,0 ENDIF leaf at the right location, DEL 2 and whose length is !Handle (scale sensitive) governed by the scale of IF dh THEN the drawing. It also ADD2 lw/2,0 reminds the user if a doo ROT2 -op2 handle is present or not. IF A_<51 THEN LINE2 -lw+lw/12,0.05,-lw+lw/12,-lt-0.05 ENDIF The swing of the door is DEL 2 determined by a separate ENDIF parameter op2, and has !Swing its own pen colour PEN spen ARC2 lw/2,0,lw,180-op2,180

The 2D Script in full 2.80

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

All along, you should be making regular checks on the 3D in the GDL, then the 2D. It’s time to test it for real. Return to the ArchiCAD project floorplan, draw a wall. Click on the Doortool and place your new door. The one you have just saved will be the first door that gets placed. Check that it works in 3D view. Try altering its settings. Try entering negative or huge opening angles. Flip it, flip and rotate it. In each case, compare the 3D result with the 2D symbol. Move the frame in and out of the opening. Have a look at how the hole in the wall is drilled. GDL normally cuts a rectangular hole in the wall, ‘A’ in width and ‘B’ in height, but leaving the default wall material in the reveal. The WALLHOLE command should enable you to change that material.

Add the Handle As with the door, you need to depart and make the handles as a macro object. The handles could be a lot of separate macros, but in this case, they have been integrated into one macro object with its own value list. This enables you to use them separately should you wish to, and stops your library being cluttered with an excess of tiny files. You need to make a handle and then flip it to appear on the other side of the door. There is some trickery in working out which way lever handles should go, but they are completely solved in this example, so learn from this. These are the right way round so that when they come into the main door object, they will be the right way round and up, and will attach to the face of the door correctly.

Parameter box in the door handle

!Door Handle macro :Voyager Course IF dh=0 THEN END IF dh>3 THEN dh=0 MATERIAL hmat MULz -1 GOSUB 100+dh:!Knob or Lever DEL 1 ADDz lt GOSUB 100+dh:!Knob or Lever DEL 1 END:!_____________________ 101:!Knob RESOL 7 PUT 0,0.035,1, 0.01,0.035,0, 0.015,0.020,0, 0.030,0.020,0, 0.045,0.030,1, 0.070,0.030,1, 0.080,0.010,1 ROTY -90 REVOLVE NSP/3,360,63,GET(NSP) DEL 1 RETURN 102:!Lever RESOL 7 PUT 0,0.035,1, 0.01,0.035,0, 0.015,0.012,0, 0.050,0.012,0 ROTy -90 REVOLVE NSP/3,360,63,GET(NSP) DEL 1 ADDz 0.05 PUT 0.1,-0.01,13, 0.0,-0.02,13, 0.0, 0.02,1013, 0.1, 0.01,13, 0.1,-0.01,1013, 0.0,-0.02,-1 PRISM_ NSP/3,0.01,GET(NSP) DEL 1 RETURN 103:!Tube Lever RESOL 7 PUT 0,0.035,1, 0.01,0.035,0, 0.015,0.012,0 ROTy -90 REVOLVE NSP/3,360,63,GET(NSP) DEL 1 RADIUS 0.012,0.03 ADDz 0.015 CYLIND 0.03,0.012 ADDz 0.03 ELBOW 0.03,90,0.012 ADD 0.03,0,0.03 ROTy 90 CYLIND 0.05,0.012 DEL 4 RETURN

The door handle script in 3D The three door handles used in this example You do not need to give the handle a 2D script, but if you wanted to use it separately, give it a PROJECT2 script, save it as a library part Object, not as a Macro object – it can then be placed independently in a floorplan. The variables used in the handle are the same as those in the parent Door object.

!Door Handle – add to 3D script IF dh THEN ADDx lw/2 ROTy -opa3 ADD -lw+lw/12,0.9,0 CALL dorhandl_macro65 PARAMETERS lt=lt, dh=dh,hmat=hmat DEL 3 ENDIF

Add this to the 3D script just before the END ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Finishing off – and the User Interface Before we go onto that, just look at the 3D script here, and at the example on the CD. As a final tidying up operation, you can see that the Wallhole, Doorframe, Doorleaf and Doorhandle routines are all tidied away into subroutines, leaving the executive portion of the script delightfully minimal, and easy to understand. A User Interface could be built for the entire door, including all the options for handles and materials. This example is following the Graphisoft route which is to leave the majority of parameters in the normal place but to build a special visual interface – what I call the Pictorial Value List – to help the user decide which door to use. It could be further developed to choose the style of handle. Perhaps you can try that yourself. First, you have to render each door, seeing it face on, all at the same scale, then move the images into photoshop and organise them into tiles. The tiling must be rigorously evenly distributed in spacing. Make the final image no more than 270-280 pixels wide, either by good planning, or by re-pixellating the final image. Apply a ‘sharpen’ filter if you re-pixellate. Make a note of the height of the image. This UI_INFIELD starts with value list parameter name, top corner, total field size (in pixels). UI_INFIELD 'ls',6,20,298,170, 1,'doorexamp.jpg',8,2, The 1 is mandatory, then the Filename 68,160,58,138, of the tiled image. The total number of 1,'Empty', images and the number of rows. 2,'Flush', Then the Cell X and Y dimensions 3,'1-panel', 4,'2-panel', followed by the amount of the cell 5,'3-panel_a', occupied by the tiled image (must be 6,'3-panel_b', smaller than the cell). 7,'4-panel', Follow this with a list of the door styles 8,'Circular' and their indexes, exactly as in the Value list. UI_STYLE 2,0 UI_DIALOG "Leaf styles"

!Example Door, using Tube !and Prism: Voyager !3D Script PEN pcol !Wallhole GOSUB 50 IF dort=0 THEN END:!No door IF E~ THEN !Flipping routine MULz -1 ADDz -frt+C_ ENDIF !Frame IF frw>0 THEN GOSUB 100 !Door ADDx lw/2 ROTy -opa3 GOSUB 200+dort DEL 2 !Door handle IF dh THEN GOSUB 300: DEL TOP END:!______________________

Final executive portion of the 3D script

UI_OUTFIELD 'Door Selector for GDL Cookbook',6,196,298,25 UI_STYLE 1,0 UI_OUTFIELD 'Copyright David Nicholson-Cole',6,212,300,25 UI_OUTFIELD 'Use this as a guide for door building. Return to the parameter box for general settings.',6,226,298,25

one is 272 by 316 pixels. This is very important for getting the The tiled image of the doors UI_INFIELD statement to work. The file can be a JPG, TIF or BMP and must be in a loaded library. If you are in AC already, reload libraries for the new file to be found. Open the GDL Cookbook at the pages on the User Interface; this explains what each field of the INFIELD statement is doing. Keep clicking on the preview button to see how it is going. In this case, the Cell width must be smaller than or equal to a quarter of the width of the main image, but the Cell height must be more than half the height of the main image. Try varying the numbers in the INFIELD statement and you will see how wrong it can get with just a small error.

Warning In some releases of AC, excessive playing about with User interface (and the errors resulting) can cause AC to erase great chunks of the 3D script and delete your parameters. No Kidding!! This is a bug not a feature. Do this final bit of work on a COPY of your door object file. The user’s settings box with pictorial value list.

End Note

Make a Preview image for a nice icon.

Please note that this door is very simple. Real doors take even more work – a wider variety of door and glazing styles; letter box and knocker; parametric transoms and stiles; more ironmongery options including kickplates and pushplates; porch frames and fanlights. The door here is a generic example which shows the essential technique with minimal detail, including the relationships of macro objects to the parent door-object, the notorious flipping and rotating problem and the design of the User Interface. Good luck with your own attempts.


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Anglepoise Lamp This is an exercise in the use of : • LIGHT • REVOLVE • PRISM_ with Poly lines. • Mirroring objects using the MUL command OR the model to have any credibility in an interior view, it has to be able to hinge like a real lamp, and to be able to switch on its light. This one does both of these things. I use it in interiors. You can start it as an object (and convert to a lamp later) or in 6.5 onwards, you can start as a lamp from the beginning. My technique is to hammer in some rough script, to get the model started (as on the left). Once I get to the point where it needs to be structured (certain elements need to go into Subroutines) I convert the text, as shown below, by wrapping Line numbers and ‘Returns’ around the blocks of text, putting an END statement in near the top, and then inserting GOSUB to each of the newly created subroutines. For example, here, I got one main arm working well, and then I want to mirror the main arm on the other side of the pivot.


!Anglepoise Lamp !3D Script PEN 1 !Lamp Base ELLIPS 0.05,0.1 !basepivot ADD -0.025,0.01,0 ROTx 90 PRISM_ 5,0.02, 0,0,15, 0.05,0.00,15, 0.05,0.06,15-2, 0.00,0.06,1015, 0,0,-1 DEL 2 !button ADD 0.07,0,0.025 CONE 0.02,0.013, 0.011,90,90 CYLIND 0.03,0.007 DEL 1

Left: is a first working script Right: is the same script, ‘massaged’ into shape by converting it into two subroutines numberd 100 and 200, not forgetting the button at 110:.

Now that the script has been structured into subroutines, the arm routine (in 210) can be MULled around the Y-axis, which means that you get a mirror image – this is done in subroutine 200. As the Main arm prism will be used again for the Second arm, the PRISM command is, itself, a small subroutine (220) The bright stainless button for the switch is also used as an axle for the arms, so it is a subroutine, called by the other subroutines.

!Anglepoise Lamp !3D Script MATERIAL 0 PEN lcol RADIUS 0.02,0.03 GOSUB 100 !Lamp base GOSUB 110 !switch GOSUB 200 !Lamp arm END!_________________ 100: !Lamp Base ELLIPS 0.05,0.1 !base ADD -0.025,0.01,0 ROTx 90 PRISM_ 5,0.02,!basepivot 0,0,15, 0.05,0.00,15, 0.05,0.06,15-2, 0.00,0.06,1015, 0,0,-1 DEL 2 RETURN

This is the final shape we are aiming at – it helps to draw it freehand in your book, or at least to think out the junction details simplify then appropriately. Avoid over complex levels of detail. For example, there is no point in making the steel springs for the anglepoise unless the lamp is the central point of the model. If it is furniture in an interior design, the level of detail shown here is adequate. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Make a Lamp If the Anglepoise started life as an object, you can convert it from an OBJECT to a LAMP. Save the GDL object, and close it. ‘Open Library Part’ again, and you can say what you want it opened as. This time, make it come back as a LAMP, and you can now save it as a LAMP. It will add more parameters, all concerned with Lighting, and all starting with single letters, which cannot be edited – but which can be used. Below is the final script – in the form of a LAMP, not an OBJECT. All this means is that a few parameters are used in the subroutine containing the light bulb. When you have saved the lamp, you may be a bit perturbed that you can no longer find it, but this is because it has been saved as a LAMP and can only be brought back with the lamp icon in the tools palette. !Angle Poise !Master Script IF lampang> 70 IF lampang<-90 IF armang1> 80 IF armang1<-80 IF armang2>120 IF armang2< 0


lampang= 70 lampang=-90 armang1= 80 armang1=-80 armang2=120 armang2= 0

Master Script: You can use this to prevent the user defying gravity and materiality by bending the lamp until it goes into its own arms. 110: !Switch ADD 0.07,0,0.025 CONE 0.02,0.013,0.011, 90,90!base GOSUB 230 !Steel button DEL 1 RETURN 200: !Lamp Arm GOSUB 210 !arm part MULy -1 GOSUB 210 DEL 1 RETURN 210: !Arm part ADDz 0.065 ROTx 90 GOSUB 230 !axle ADDz 0.01 ROTz -armang1 GOSUB 220 !arm prism ADD 0,armlen,-0.01 GOSUB 230 !axle DEL 5 RETURN 220: !arm prism PRISM_ 5,0.01, !arm -0.01,0.00,15, -0.01,armlen,15, 0.01,armlen,1015, 0.01,0.00,15, -0.01,0.00,1000 RETURN 230: !axle / switch MATERIAL "stainless Steel" CYLIND 0.03,0.007 !axle MATERIAL 0 RETURN


300: !upperarm ADDz 0.065 !lift ADDy 0.005 !centralise ROTy armang1 ADDz armlen ROTy armang2 ROTx 90 GOSUB 220 !arm prism ADDy armlen ADDz -0.01 GOSUB 230 !axle ADDz 0.005 CYLIND 0.02,0.015!shade swivel DEL 9 RETURN 400: !Lamp itself ADDz 0.065 !lift ROTy armang1 ADDz armlen ROTy armang2 ADDz armlen ROTy lampang ROTz lamtwis GOSUB 410 !Lampshade DEL 7 RETURN

Using another monitor


CI cards are very cheap now; if you have a redundant monitor lying around the office, why not get a second video card, and have a second monitor attached to the computer? It is very helpful to have a second screen where the 3D view gets generated, or where you can store your palettes.

410: !Lampshade Body ADDz 0.01 !lift CYLIND 0.02,0.015 !swivel ADDz 0.05 !total is 0.06 GOSUB 420 !outercolorshell ADDx 0.001 MULy 0.98 MATERIAL "whitewash" IF C THEN MATERIAL "lamp" GOSUB 420 !innerwhiteshell GOSUB 430 !bulb DEL 4 RETURN 420: !lampshade lathe REVOLVE 5,360,1, -0.05,0.01,0, -0.03,0.01,0, -0.03,0.03,0, 0.03,0.04,0, 0.15,0.10,0 RETURN 430: !Lightbulb ROTy 90 CONE 0.08,0.015,0.025,90,90 ADDz 0.09 SPHERE 0.03 DEL 2 !Light points along X IF C=1 THEN LIGHT G/100*D,!set intensity G/100*E, G/100*F,!RGB 1, !shadow on 0.2, !start radius 30,50, !Alpha beta 0.1, !anglefalloff 0,2, !distances 0.1 !distfalloff ENDIF RETURN

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Script Commentary As an articulated model gets longer, you get an increasingly long chain of cursor commands that has to be followed each time you do the next element of the object – you can see what I mean in the script for the Upper Arm. The Lamp element itself can also twist/rotate, as well as vary its light level and colour. Notice that the cone of the lampshade is drawn twice, the outer shell is coloured, and the inner shell is Lamp coloured. As one wants the lamp to have bright colours, the Lamp body MATERIAL is set to *zero* and you use PEN to decide on its colour. A better method to use is the one in ‘Fire Extinguisher revisited’ where you use REQUEST and DEFINE MATERIAL to create material with metallic or plastic qualities. You may have to use Trial and Error to get the Distance Falloff and other factors just as you want them – by doing some photorenders, with Lamps active. Don’t forget to update the Executive script regularly as you add in subroutines for the lamp and arms.

Recursive Tree

!Anglepoise Lamp !light object !Final Executive 3DScript MATERIAL 0 PEN lcol RADIUS 0.02,0.03 GOSUB GOSUB GOSUB GOSUB GOSUB

100 110 200 300 400

!Lamp base !Switch !Lamp arm !upperarm !Lamp itself

The RADIUS command is the final touch, to make sure you are not adding too many polygons.


!Anglepoise Lamp !2D Script HOTSPOT2 0,0 PROJECT2 3,270,2

2D Script: Because the lamp can hinge and move, it has to be scripted as a PROJECT2, but it’s is a good idea to have a Hotspot at the Origin, so that you can pick it up easily.

This exercise demonstrates: • Recursive programming • Using a Macro • Attention paid to polygon count


REES are one of the biggest problems in 3D modelling because it is difficult to make them look natural and random, and they take a very long time to render due to the high number of polygons. This example of a winter deciduous is a remarkable piece of programming written by a GDL friend, Phil Cannon. It has a very natural look, and if used in a partially 2D form, it has few polygons. I have adapted it (with permission from Phil) for the Cookbook, because the recursive CALL statement is so wickedly daring that I cannot imagine how he dared to even try it out in the first place. He says it was one of those ‘2 in the morning’ decisions!

How does this tree work? The tree consists of a ‘parent’ and a ‘child’ – the parent is the Trunk and the CALL commands for the first few branches; the child is the Branch which then calls itself many times. I have adapted it so that the trunk is always solid and rather knarled looking (by using SWEEP). The rest of the tree can be done as a set of branch structures, using either a series of 2D PLANEs, or solid CONEs . Needless to say (even with a resol of 5) the CONEs take vastly longer to render than the PLANEs, having 7 polygons each, compared with 2. They also look far too heavy; and it’s in the nature of the algorithm that if you made the cones small enough to reduce to the size of real twigs, the iterations would produce so many that it would take all your computer’s time to draw just one or a few trees. In silhouette, the Plane-based tree looks more realistic than the Cone-based one. The buildings in your model can be glimpsed more easily through a winter tree than a fully foliated one. ©Copyright Marmalade 1998, 1999, 2000, 2001

Parameter box for the TREE The parameters are kept very simple in naming, to one letter, so that the first 6 letters, c, d, e, f, g, h are all the same meaning in the Tree as in the Branch. In that way, the CALL command is reduced to the most simple form, CALL "recursive_Branch" a, b, c, d, e, f, g, h. (not needing the word PARAMETERs, or a long line of c=c, d=d, e=e, f=f etc etc.) 2.85

The GDL Cookbook 3 – Voyager

The tree as a series of Planes

The Tree as a series of Cones

!Recursive Tree !3D Script !!1996 Phil Cannon !Modified, with !PC's permission !by David NC, Dec 1999 !Trunk MATERIAL e GOSUB 100:!trunk !Branching System MUL A/9,B/9,1 ADDz thit-thit/3 ROTx 9+rnd(2) CALL "recursive_Branch" a,b, c,d,e,f,g,h DEL 2 ADDz thit !Centre branch ROTx -10-RND(25) CALL "recursive_Branch" a,b, c,d,e,f,g,h DEL 2 ADDz thit ROTz 180 ROTx 9+rnd(2) CALL "recursive_Branch" a,b, c,d,e,f,g,h DEL 1 ROTz 90 ROTx 9+rnd(2) CALL "recursive_Branch" a,b, c,d,e,f,g,h DEL 1 ROTz 180 ROTx 9+rnd(2) CALL "recursive_Branch" a,b, c,d,e,f,g,h DEL TOP END:!------------100:!more realistic trunk MUL twid/0.6,twid/0.6,1 ROTz RND(180) SWEEP 10,2,RND(60),0.6,63, 0.1,0.2,0, 0.1,0.1,0, 0.3,0,0, 0.1,-0.25,0, 0,-0.2,0, -0.05,-0.25,0, -0.3,-0.05,0, -0.25,0,0, Phil’s original trunk -0.2,0.15,0, was a Cone, but the 0.1,0.2,0, SWEEP gives a more 0,0,0, irregular section, and 0,0,thit the twist makes it look DEL 2 knarled RETURN

Normally, if a library object calls itself, the effect is similar to a Subroutine GOSUBbing itself – but worse. GOSUB can be cancelled with Ctrl-Stop, but the CALL causes the computer to freeze until rebooted. In this case, the diameter and length of the cones or planes are being reduced by 0.8 each time, so when they reach a minimum diameter, they stop proliferating. The main tree object calls 5 branches, but the branches then call themselves to form the smaller branches and twigs.

!Recursive Branch !3D Script !Phil Cannon !Adapted by DNC RESOL 15/g MATERIAL e ROTx (10+rnd(25)) IF h THEN !3D CONE c,d,d*0.8,90,90 ELSE ROTx 90 POLY 4,!2D The 3D option – a -d,0, CONE d,0, d*0.8,c, The 2D option – a -d*0.8,c PLANE DEL 1 ENDIF BODY 1 ADDz c IF d<0.14 AND d>f THEN GOSUB 1100 ENDIF c=c*0.8 d=d*0.8 IF d<f THEN 1099 FOR t= 1 TO g STEP 1 ROTz 360/g CALL "recursive_Branch" a,b, c,d,e,f,g,h NEXT t 1099: DEL TOP END:!----------1100: LET g=5 ROTx 5 RETURN

Parameter box for the BRANCH


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

2D Script The 2D would be too slow if you have a PROJECT2; so you first save the object with Project2. Then explode a copy of the object into 2D, copy and paste it into the 2D Symbol window of the tree. Centre it carefully. make sure it is the right way round. If you add your own 2D hotspots to the symbol, the object will not be stretchy, so you write the stretchiness into the 2D Script – using FRAGMENT2 to call up and display the 2D Symbol. PEN L_ means that the user selected pen will be used, even if the hotspots are black.

!Recursive Tree – !2D Script !!PROJECT2 3,270,2 PEN 1 HOTSPOT2 0,0 HOTSPOT2 0, B/2 HOTSPOT2 0,-B/2 HOTSPOT2 A/2,0 HOTSPOT2 -A/2,0 !Stretchy leafball PEN L_ MUL2 A/9,B/9 FRAGMENT2 1,1 DEL 1

ANOTHER way (type 3 below) to make a tree more realistic is to use a scanned or generated image of a tree, create an Alpha Channel for the sky to show through; and impose that on a Picture library object with the ability to turn towards the camera. You can satisfy a wider variety of trees. PhotoTrees cause a high memory overhead despite fewer polygons, because ArchiCAD tries to remember every tree it has already done.

Houses by Letts Wheeler, model by DNC, 2D Tree by Mick Kingsbury

All the Trees are aware of the camera position, and look most solid from the camera’s view. A version of this is in the Cookbook Library.

Tree questions How do others generate large quantities of trees in their site model renders?


HERE are several ways of doing trees. Trees on their own are a potential disaster, due to the potential for thousands of polygons in each tree. If the trees are distant, there is no point in a model that faithfully and geometrically tries to build every leaf. But if you are doing a close up, and a tree is important for authenticity, then a geometrically modelled tree is what you want. So, First you can have a 3D geometrically modelled tree – if it’s any good, it will have randomised branches, and variable height and leafdensity and colour, and leafball shape. I’ve got one, but the best I know of is one done by Mick Kingsbury in Nottingham, but it’s not for sale. Second, you can have a 3D 'lollipop' style tree, basically a ball on a stick which sounds dreadful, but you can have subtle variations such as using a texture with alpha channels to make it look leafy, shape variations to make it tall+thin, or squat shape, and can reduce the resolution of curvature to make it more polygonal than ball shaped. The result, grouped together with a randomiser to vary the height of each, the trunk height and diameter, the leafball shape and height, can look very effective and have only a fraction of the polygons. ©Copyright Marmalade 1998, 1999, 2000, 2001

Third, you can have 2D trees, which turn to face the camera. These can be Picture objects (in which case you have to have some alpha chanelled photos of tree types – these can be purchased from library suppliers (look on the Graphisoft web site, someone advertises them). There is a simple one in the GDL Cookbook Library. ArchiTerra has excellent picture trees with a collection of alpha channelled tree images. The benefit of these is that they are upright Prisms, not rectangular picture objects, so they look reasonably good in 3D views, and cast shadows. Fourth, you can have 2D tree using 3D elements displayed in a 2D arrangement, which turn to face the camera. The GDL Cookbook could do with a longer feature on trees of all four types, that’s an idea for a future edition. I have been doing a University Campus model, doing the general building shapes (a 3D figure ground plan really) and found that the Lollipop trees are the best solution, with randomised heights and diameters, and a texture that has alpha channels (to make them look filigree)


The GDL Cookbook 3 – Voyager

Kitchen Chair This chair exercise is an example of: • bPRISM_ – Bent Prism • Polylines in Prisms • Using CONE • Passing parameters to a macro • Using Symmetry • Using Fragment2 in the 2D


IRST OF ALL, note that we only need to build half the chair – which can then be mirrored. For this exercise, we are not bothering to make the chair parametric. First hammer in the outline of the seat of the chair. Do it as a chamfered shape first, and you will be able to curve the chamfers later. We use PRISM_, not PRISM, because we want to add in curves at the corners using Polylines. By the way, initially there is only one Parameter in the parameter box, ‘cmat’ for the Material. Later, we can add a value list for the arms.

Make it into a structured form, with subroutines Now convert that seat prism to a Subroutine. Look at these two scripts (right) and follow likewise. In addition, convert the chamfers to curves, by adding 1000 to the original masking value of 15. Then subtract 2 from 15 to remove the vertical lines in the curve. Add the ADD command to lift the seat to the correct height. If you have done this in the ArchiCAD environment, it will come in with 6 decimal figure numbers. Here, I have rounded them down to simpler looking numbers.

Make a subroutine for the legforms Next, you need to develop a conical form to use for the legs, leg braces and many other parts of the chair. This will be an example of ‘passing parameters’, because the conical legs are of different lengths and diameters. Having got it working, store it as a subroutine, and make sure it works by first using it for the legs of the chair. By passing to it different parameters for length and radius, you will be able to use it for the arms.


!Kitchen Chair !Voyager Course PEN 1 MATERIAL cmat 100: !Seat PRISM_ 7,0.05, 0.00, 0.00, 15, 0.00, 0.45, 15, 0.20, 0.45, 15, 0.26, 0.40, 15, 0.23, 0.05, 15, 0.18, 0.00, 15, 0.00, 0.00, -1

Do it as a chamfered shape first

!Kitchen Chair !Voyager Course PEN 1 MATERIAL cmat GOSUB 100:!Seat END:!-------------100: !Seat ADDz 0.44 ROTy -2 PRISM_ 7,0.05, 0.00, 0.00, 15, 0.00, 0.45, 15, 0.20, 0.45, 15-2, 0.26, 0.40,1015-2, 0.23, 0.05, 15-2, 0.18, 0.00,1015-2, 0.00, 0.00, 15 DEL 2 RETURN

!Kitchen Chair !Voyager Course PEN 1 MATERIAL cmat GOSUB 100:!Seat d1=0.20: d2=0.25 r1=0.02: r2=0.03 CONE d1,r1,r2,90,90 ADDz d1 CONE d2,r2,r1,90,90 DEL 1

This next little routine will be the basis of all future leg and braces for the chair. Copy the routine above and make it into two r outines, number 200: and 210:. Thus you get one leg working.

The next step is to write a conical leg routine !Kitchen Chair !Voyager Course PEN 1 MATERIAL cmat GOSUB 100:!Seat GOSUB 200:!Legs END:!--------------100:!Seat (see text box above) RETURN 200:!Chair Legs etc d1=0.20: d2=0.25 r1=0.02: r2=0.03 GOSUB 210: !Rearleg RETURN 210:!ConeLeg CONE d1,r1,r2,90,90 ADDz d1 CONE d2,r2,r1,90,90 DEL 1 RETURN

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager 200:!Chair Legs etc d1=0.20: d2=0.25 r1=0.02: r2=0.03 ADD 0.20,0.40,0.45 GOSUB 210 !Frontleg DEL 1 ADD 0.17,0.05,0.45 GOSUB 210: !Rearleg DEL 1 RETURN 210:!ConeLeg CONE d1,r1,r2,90,90 ADDz d1 CONE d2,r2,r1,90,90 DEL 1 RETURN

By a bit of pushing and pulling and twisting with ROT commands, you can get the legs to splay correctly.

200:!Chair Legs etc d1=0.20: d2=0.25 r1=0.02: r2=0.03 ADD 0.20,0.40,0.45 ROTx 180 ROTx 5 ROTy 5 GOSUB 210 !Frontleg DEL 4 ADD 0.17,0.05,0.45 ROTx 180 ROTx -5 ROTy 5 GOSUB 210: !Rearleg DEL 4 RETURN

Make the Legs Now extend the use of subroutine 210 to include the other leg. Initially, the legs are vertical. 300:!Arms ADD 0.22,0.38,0.50 ROTy 9 ROTx -6 d1=0.10: d2=0.10 r1=0.01: r2=0.02 GOSUB 210 !ArmSupport DEL 3 RETURN

The Arms Next, place a coneleg in the location for the Arm upright support – slightly angled forward. Then add in the Prism for the Arm itself. This has a curvy end – could be done by a simpler prism and a Cylinder at the end. But here it is done with a masking value that gives you a Polyline rounded profile.

Nudge the ar m into the right place

VALUES: You can use a Values List to decide if arms are to be included or not. VALUES 'arms' 'Include arms', 'Hide arms'

Making the whole chair Your main ‘executive’ script should now look like this on the left, and once you start to add in the back, will look like this drawing on the left. Half the chair, is drawn. You can now take advantage of symmetry. Modify the script using a MULx -1 so that the whole thing is repeated with it mirroring in the X direction. Your Executive script grows as subroutines are added.

300:!Arms IF arms='Include arms' THEN ADD 0.22,0.38,0.50 ROTy 9 ROTx -6 d1=0.10: d2=0.10 r1=0.01: r2=0.02 GOSUB 210 !ArmSupport DEL 3 ADD 0.18,0.02,0.69 ROTz -3 PRISM_ 8,0.04, !Arm 0.00,0.00, 15, 0.02,0.10, 15, 0.02,0.39, 15-2, 0.10,0.39,1015-2, 0.08,0.36, 15, 0.07,0.12, 15, 0.05,0.00, 15, 0.00,0.00, -1 DEL 2 ENDIF RETURN

!Kitchen Chair !Voyager Course PEN 1 MATERIAL cmat GOSUB 100:!Seat GOSUB 200:!Legs GOSUB 300:!Arms MULx -1 GOSUB 100:!Seat GOSUB 200:!Legs GOSUB 300:!Arms DEL 1 END:!---------------

©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

The Back Put in the double cone for the back pillars – leaning over, of course.

Making the Back Now, it’s time to build the Curved Back shape – using bPRISM ! The trick with Polylines is to create the Prism object first with simple chamfered corners. Once you get the Prism working correctly, add in the 1000 polylines to make the corners curve. Then lift it into position and rotate as required to make it fit. When you start making a component, do not worry about first making it on the floor, and leaving out the curved bits.

400: !Back ADD 0.18,0.05,0.50 ROTx 8 ROTy 6 d1=0.23: d2=0.33 r1=0.02: r2=0.03 GOSUB 210 !BackSupport DEL 3 RETURN

This uses the same macro routine (210:) that was used for the legs; just pass it larger parameters.

400: !Back ADD 0.18,0.05,0.50 ROTx 8 ROTy 6 d1=0.23: d2=0.33 r1=0.02: r2=0.03 GOSUB 210 !BackSupport DEL 3 GOSUB 410:!CurveBack GOSUB 420:!Slats RETURN 410:!CurvedBack ADD 0,-0.04,1.05 ROTx 96 BPRISM_ cmat,cmat,cmat, 7,0.045,0.8, 0.00,0.00, 15, 0.00,0.15, 15, 0.27,0.15, 15-2, 0.31,0.10,1015-2, 0.30,0.04, 15-2, 0.25,0.00,1015-2, 0.00,0.00, -1 DEL 2 RETURN

Leg braces The legbraces are important enough to deserve their own subroutine. You can use the coneleg (210) for the fore-and-aft brace, but the cross brace simply needs a Cone. Nudge them into position with the ADD commands, using a planview in wireline. Use the number 250: to keep it near the other leg routines.

250:!Leg Braces ADD 0.19,0.03,0.25 ROTz -4 ROTx -90 d1=0.19: d2=0.19 r1=0.01: r2=0.02 GOSUB 210:!Legbrace DEL 3 ADD 0.21,0.22,0.25 ROTy -90 CONE 0.21,r1,r2,90,90 DEL 2 RETURN

Back slats Finally, you add in the back slats. These need individual nudging into position, and rotating to the correct angle – using the wireline view in plan and side elevation. This subroutine for the Slats is called from within subroutine number 400 – it’s part of the back assembly. It could also be called from the executive script as it is a tidily self contained object. That’s structured programming in action – objects!

420:!Slats ADD 0.02,0.01,0.50 ROTx 7 BLOCK 0.05,0.01,0.56 DEL 1 ROTz 5 ADDx 0.08 ROTz 5 ROTx 7 BLOCK 0.05,0.01,0.56 DEL 5 RETURN

Autosizing text in 2D When you ‘Define Style’ for text, the font height is usually a fixed height that will appear on the printed or plotted sheet at that size, regardlessof scale. More often, you may want the font to appear constant relative to the object that it is part of: so you want it resize whenever the drawing scale is shanved. Font size has to be in millimetres. Object is in metres. So multiply the object dimension by 1000. Then divide the resulting size by the Scale of the drawing. This finished size will stick faithfully to the size of the object it relates to, whatever the drawing scale. In this case the font size is twice the tube diameter. fntz=2*t1diam*1000/A_


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Finishing off !Kitchen Chair !Voyager Course

Your final ‘executive’ script should look like this – neatly tabulated and documented. Your final chair should look like this. The curved edges have had their vertical lines tidied away by using 1013 instead of 1015 in the PRISMs.

PEN 1 MATERIAL cmat GOSUB 100:!Seat GOSUB 200:!Legs GOSUB 250:!Leg Braces GOSUB 300:!Arms GOSUB 400:!Back MULx -1 GOSUB 100:!Seat GOSUB 200:!Legs GOSUB 250:!Leg Braces GOSUB 300:!Arms GOSUB 400:!Back DEL 1

2D Script or Symbol? Use FRAGMENT2! As this chair is not parametric, you would find it best for use in the floor plan to use a Symbol. First use PROJECT2, then save. Place it in your floor plan. Select the chair with arms and apply the Explode! command to it. This makes it to a 2D symbol. Copy and paste that into the 2D Symbol window of the chair object. Select all the lines in that symbol, open the line settings box and put them all into Fragment 2. Do that all again with the chair with no arms, explode, copy and paste into the 2D symbol. This time leave them all as Fragment 1.


!Kitchen Chair !Modified in 2D Mar 2000 PEN pcol !!PROJECT2 3,270,2 IF arms='Include arms' THEN FRAGMENT2 2,1 ELSE FRAGMENT2 1,1 ENDIF

Then remove the Project2 command from the 2D Script. Add some hotspots to make it easier to pickup.

!North Arrow !by Brian M. Frank !Melville Thomas Mobley Archs !Sept 98 Modified by DNC Oct 98



D Script: This script was emailed to me by

Brian Frank because it didn’t quite work. I tidied it up and sent it back, and it’s a useful demonstration of 2D. By using A and B as the determinants of size it is completely stretchy. It also has the bounding box removed. The northpoint used a filled POLY2, and LINE2 to form the cross shape. Hotspots are also positioned at key positions. The Fill pattern and Pen colour are settable by the user. The script shows how to set a text style in a 2D script, and how to control font and fontsize. Font height is based on millimetres (1/25th ”) in the plotted or printed output, regardless of the scale of the drawing. The US version uses ‘points’ (1/72th inch). ©Copyright Marmalade 1998, 1999, 2000, 2001

PEN C !Ideal size A=3 B=6 LINE2 0,-B/2, 0,B/2 LINE2 -A/2,0, A/2,0 LINE2 A/4,0, 0,-B/2.5 SET FILL D POLY2_ 4,3, 0,0,1, 0,B/2.5,1, -A/4,0,1, 0,0,1 PEN c DEFINE STYLE "north" ft, E,5,0 !E is Font size,FT is Font SET STYLE "north" string = "N" TEXT2 0,B/1.75,string !Hotspots HOTSPOT2 0,0 HOTSPOT2 A/2,0 HOTSPOT2 -A/2,0 HOTSPOT2 0,B/2 HOTSPOT2 0,-B/2 !turn off bounding boxes


The GDL Cookbook 3 – Voyager

Some more GDL Syntax Strings and things



REQ and REQUEST get information from ArchiCAD about the current model and system. Global Variables get you numerical information. REQ and REQUEST can get you additional information, numerical or alpha which you can use. The most common uses for REQUEST are getting the RGB colours of the current pen or material, and the Time and Date. This is a case where you need to look at the manual as there are 4 whole pages of things you can request. Unfortunately there is a small mistake in the example. REQUEST can be used on its own, but it will always report an error with ‘Check Script’. You should write it as this, with a dummy variable x before the statement:

HAT is a String? It is a sequence of alpha characters which have no numerical value. In GDL, a let of alpha characters on their own are either a parameter or a command, and have to be doing something. A set of alpha characters behind an exclamation mark are a Comment. A set of alpha characters in quote marks are a String. ‘123.456’ is a string because it is in quotes. Materials (and other attributes) can be named by a string or an index number – you can say Material ‘Whitewash’, or Material 18.

STR( ): is very useful in 2D labelling and Properties Scripting – when you often need to combine many numbers together to make a long string of letters. You can use it most in 2D Scripting, when you wish to annotate a symbol. For example, if you have a stretchy staircase, you can get it to display a string like: “Pitch= 38.462 degrees”. This would indicate that you need to stretch it a bit more to reduce the pitch, or squeeze it if the stair is in a house. The most common use of STR is in the first form above, whereby you say how many digits will be needed to represent an entire number, and how many of those digits will occur after the decimal point. For example: item=123.456 STR(item,6,3) gives you ‘123.456’ STR(item,6,1) gives you ‘123.5’ STR(item,4,3) gives you ‘123.456’ STR(item,7,2) gives you ‘123.46’ You might then say: lstr=“Length=” + STR(item,6,2) and get a string variable called lstr. x=STRLEN(‘hello’): returns a value of 5, the number of letters.

x=STW(‘hello’): gives you a dimension in metres equal to the length of the word, in its present text style. Allowing you to build a 2D box round it, or to get a good results if labelling an object where you want the label to fit neatly to the object, whatever the drawing scale. SPLIT( ): This is an interesting command that convert strings back into numbers – complicated to use, but worth exploring for the Voyager. See the ‘Bendibar’ for an example. It half-does what VAL( ) does in BASIC. To me, its most useful purpose has been rapid parsing of Value List answers – reducing the need for many IF statements. !Value List definition for a Stair VALUES 'handtyp' '1-Parallel rails', '2-Rail + spindles' !Parse the type of Handrail x=SPLIT(handtyp, '%n',htyp) !htyp is the flag for the rail

As a result of this, htyp is equal to either 1 or 2.


x=REQUEST(‘RGB_of_Pen”, pcol,red,green,blue)

will return three variables for the Red, Green and Blue components of red, green and blue from a Pen colour called pcol. If you then wanted to make a material of that colour, you could write it as: DEFINE MATERIAL ‘dnc_matl’ 4,red,green,blue

Defining PEN with REQ You cannot define PENs directly, but the following statement will find a pen closest to your RGB definition. pcolr= REQ(“Pen_of_RGB 0.26 0.74 0.66) will return the pen index pcolr nearest to turquoise. No Commas. You cannot use Variables here, only numbers will be accepted.

IND( ) IND( ) provides an index number for a Material, Text Style, Texture, Line_type or Fill. Mostly these can be specified by name, but there are times when they have to be specified by number. IND( ) does this for you. In a CALL statement, you need to specify a material by its index number, not name. In a Material definition you need to specify a Fill or Material by its number. It is most useful where you think that users have tweaked their materials library and changed some of the default numbers. For example, IND(MATERIAL, “Whitewash”) will guarantee getting ‘Whitewash’, whereas MATERIAL 18 might get a quite different result. You can use it to do the same if users have tweaked their Linetype and Fill numbers. When you make your own material in GDL using the DEFINE command the new material gets allocated a number by ArchiCAD – but you don’t know it. To be sure, type in: MATERIAL IND(MATERIAL,‘dnc_brick’)

A new Material definition using a Texture called ‘wooly_carpetTX’ might be written: DEFINE MATERIAL ‘wooly_carpet’ 22, red, green, blue, 0,61, IND(TEXTURE,‘wooly_carpetTX’)

For examples of the STW, STR and REQUEST commands, the Filestamp and Analog Clock are good examples. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Long Handrail – Swing the Cat! This handrail is an example of: • How to do long curvy objects without using ELBOW • Making curved objects stretchy • Some Circle Geometry and Trigonometry • Rigorous control of Polygon count HIS is a situation where you must use TUBE to make the object (no matter how long you have tried to avoid using TUBE!) It is also a way to organise the angular distribution of elements, in this case, the uprights of the handrail. ELBOW is a problem, especially in large curves, as it requires a very high RESOL to look good, but when you do that, you have a massive number of surfaces to render, because RESOL also applies that number to the tube surface. You cannot use RADIUS either, because its highest value is 36; in such a long sweeping curve, 36 would still seem too polygonal. There are several ways of defining a curve. The obvious one is based on 1. the Location of the Centre, 2. the Radius, and 3. the Sweep angle. In a very large curve like this, the user does not know any of these factors. They are only likely to know the distance between the ends of the chord created by the curve, and consequently, the bulge of the curve. From this, you can work out the centre-location, radius and sweep – in this case, I have devoted Subroutine 100 to working those out. These start as A and B, which makes it stretchy, but I prefer to change their names to lenc and bulg.


!Curved Handrail,external !For Racecourse scheme !3D Script GOSUB 100 : !Work out parameters GOSUB 200 : !Main Tube using TUBE GOSUB 300 : !Round ends IF nupr>1 THEN GOSUB 400:!Uprights END:!_____________________________

100 : !Work out Parameters !(could be in Master Script) lenc=A bulg=B !car = Angl of centreline & radius !bulg= the 'bulge' for the rail car = (90-ATN((lenc/2)/bulg))*2 trad1 = diam1/2 !Rad of Main tube trad2 = diam2/2 !Rad of Uprights radtube = (lenc/2)/sin(car) !radtube is Rad of whole rail radtdif = radtube-bulg !Chordline to centre IF bulg>radtube*2 THEN bulg=lenc/2 RETURN

3D Script The executive script is simply 4 lines, because there are only 4 operations to carry out. I have put round ends onto the tube, but these could have been a Boolean choice. In case the user wants zero uprights, there is an IF statement to avoid ‘divide by zero’ errors which would occur if you tried to calculate the positions of zero uprights. The user is able to set a resolution for the main curve, which could be as high as 360 (1 degree increments). The calculation works out the angular increment anginc. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Building TUBE in 3D: Swing the Cat! Next, the PUT statement is used to store all the X,Y locations. (The Z locations are all zero, and the twist angles in the tube are also zero). This use of PUT and GET is the ONLY practical way to set up a large TUBE statement. It is done in a FOR... NEXT Loop. I call this procedure ‘Swing the Cat’. This describes a loop that rotates through a circular path using angles as the counter, and using SIN and COS of the the angles and the radius to work out the XY locations. Notice that (to create the phantom start and end points) you need to make the loop start one stepping angle earlier; and you need to go one step later than is needed for the real sweep angle. You then move to the centre of the circle, and deliver the Tube statement. The 901 and 4001 numbers are required to draw the tube as a clean cylinder. (Try using 900 and 4000 to see the difference it makes.)

‘Swing the Cat!’ explained You can swing through a circle at regular angular intervals calculating the X & Y locations as you travel. When you want to know X and Y, but already know Radius and Angle (we are talking Cartesian to Polar conversion), it is usually X=R*SIN(ang) and Y=R*COS(ang) if your reference axis is the vertical. In this exercise, we have used a vertical reference line. You store the points using PUT,

300: !rounded ends ADD lenc/2,0,this SPHERE diam1/2 ADDx -lenc SPHERE diam1/2 DEL 2 RETURN

200: !Main Truss Tubing for 3D !Tube algorithm to avoid !having to use a high resol RESOL rst !Set surface resolution MATERIAL matt: PEN tcol: angd=360/rs !angular diff nrs=INT((car*2)/angd)+1!Make angd fit curv anginc=car*2/nrs !angular increment !Swing the cat! FOR k=-car-anginc TO car+anginc+0.1 STEP anginc PUT radtube*SIN(k),radtube*COS(k),0,0 NEXT k

Notice that the sweep angle is deliberately exceeded by 1/10 of a degree to avoid a decimal> binary> machine code conversion error ADD 0,-radtdif,thit TUBE 2,NSP/4,63, 0,0,901, !Formula for trad1,360,4001, ! round section GET(nsp) DEL 1 RETURN

and the resulting points can be used for the edge of a Prism, a pathway for a Tube, and all manner of useful things. You can get the effect of the resol command: 10˚ separations is equivalent to RESOL 36, 15˚ to RESOL 24 and so on. If your line is rising from the horizontal, then you use X=R*COS(a) and Y=R*SIN(a). This diagram shows how this is calculated. Imagine a right angle triangle. If you haven’t got the Cookbook handy, you can work it out from the familiar SOH CAH TOA saying. This routine can be used in all manner of objects whenever there is circular geometry. For any curved tubing, this is always easier and safer than using ELBOW.

400: Finally, you calculate the angular difference between the uprights. Then retreat to the centre of the circle, and ‘spray’ out the uprights, retreating back to the centre before doing the next one. 300: It is an easy job to put a sphere at the end of the tube. The RESOL is the same as for the tube – I recommend 12 or less.

400 : !Uprights RESOL rst angup= (car*2)/(nupr-1) !angle diff between uprights FOR k=1 TO nupr ADDy -radtdif ROTz car-(k-1)*angup ADDy radtube CYLIND thit,trad2 DEL 3 NEXT k RETURN

!2D script for !long handrail

2D Script


is simply a PROJECT2 command, with a routine to draw Hotspots to make sure you can stretch the handrail to the right size. Turn off the bounding box. make sure that the Hotspot commands occur first.


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

CONE-shapes or... Fun with Cutplane


HERE are various ways of defining the three important mathematical shapes of Ellipse, Parabola and Hyperbola. This can be done with a formula using X and Y and Radius, with string and nails stuck in a wooden board, hanging chains, or with bullets fired into the air. The easiest way is to cut a cone at different angles and observe the result. This exercise is to explore the use of VALUE LISTs, and to get the hang of manoevring CUTPLANE around the model. It also shows stretchiness and the benefit of a ‘helpful’ 2D symbol. The Ellipse – formed by cutting through the curved faces of the Cone at any angle

The Parabola – formed by cutting through the Cone at an angle parallel to the side of the Cone. Changing the distance makes the parabola sharper or rounder.

The Hyperbola – formed by cutting through the curved faces of the Cone in a vertical cut, any distance from the centre. Changing the distance makes the hyperbola sharper or rounder.

VALUES "shape" "Ellipse", "Parabola", "Hyperbola" VALUES "hlp2d" "True View","Show stretchy 2D" VALUES "twk" 10,20,30,40,50,60,70,80,90

Values List: You set up the contents of the Pop-down menus. Values which are Text have to be in quotes.

Parameters: In this case, all the user options in the setting box are defined by Pop-down menu. A Value List parameter can be an ‘ABC’ text type or a number, and you have to click the little button next to the word ‘descriptors’ to activate the pop-down effect. !Shapemaking with Cone and Cutplane !GDL Cookbook – 3D Script You must declare Materials MATERIAL 'whitewash' and Pen BEFORE you start PEN 1

cutting planes.

!Make an ellipse IF shape="Ellipse" THEN The ‘TWEAK’ here changes the form of the shape: for the ADDx A/2 ROTy ATN(B/(A/2))*twk/100 Ellipse by changing the angle of the Cutplane, for the CUTPLANE Parabola and Hyperbola by DEL 2 changing its distance from the ENDIF


!Make a Parabola IF shape="Parabola" THEN ADDx -A/2+A*twk/100 ROTy ATN(B/(A/2)) CUTPLANE DEL 2 ENDIF

Cutplane cuts away everything ABOVE it, so you only have to rotate it to the right angle, so that what you want is UNDER the CUTPLANE.

The Value list of shapes decide !Make a Hyperbola which of the IF... ENDIF IF shape="Hyperbola" THEN routines will be carried out. ADDx A/2-(A/2)*twk/100 Whichever you choose will ROTy 90 result in ONE Cutplane, so CUTPLANE you only need one CUTEND DEL 2 after you have drawn the ENDIF cone. !Draw it CONE B,A/2,0,90,90 CUTEND END

If the Values list result in changing both 2D and 3D shapes, you may have to write some short script to parse the list in the Master Script.

!Shapemaking !with Cone&Cutplane !2D Script HOTSPOT2 0,0.001 HOTSPOT2 -A/2,0 HOTSPOT2 A/2,0 Helpful 2D Scripting HOTSPOT2 0, A/2 This little routine draws an elevaHOTSPOT2 0,-A/2 PROJECT2 3,270,2 tion of the Cone on the 2D symIF hlp2d="Show stretchy 2D" THEN bol, with a stretchy Hotspot button HOTSPOT2 0,B at 0,B. POLY2 3,1, -A/2,0, If you put enough of your own 0,B, Hotspots in, you are best to remove A/2,0 the Bounding Box, which will just ENDIF

confuse the 2D symbol. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

RhombiCubOctahedron or... More fun with CUTPLANE


UTPLANE enables you to produce objects (by subtraction) that cannot be sculpted positively. For example, one can make a CUBE by cutting a SPHERE with 6 different faces. In this case, one can take a cube, and cut the corners off to create a Truncated Hexahedron, and ultimately a RhombiCubOctahedron. By varying the dimensions of the cube, and the distance of the cutting plane, one gets interesting shapes. !RhombiCuboOctaHedron !Stretchy Using Cutplane MATERIAL "Whitewash" ADDz -(A+B)/4 PRISM 4,(A+B)/2, A/2, B/2, -A/2, B/2, -A/2,-B/2, A/2,-B/2 DEL 1

Stage 1: Make Prism

First – make a CUBE There is, sadly, no command in GDL that generates a cube or cuboid from a central location. So one uses a PRISM to make it with. The parameters of width and length are made using A and B – this will make the cuboid ‘stretchy’. The height of the cuboid is an average of A + B. Having got the CUBE working, convert it to a subroutine by putting in the END statement, and boxing the routine with a number and a RETURN statement: as shown here.

!RhombiCuboOctaHedron !Stretchy Using Cutplane MATERIAL "Whitewash" GOSUB 100 !Cube END:!----------------100: !Make the Cube! ADDz -(A+B)/4 PRISM 4,(A+B)/2, A/2, B/2, -A/2, B/2, -A/2,-B/2, A/2,-B/2 Stage 2: Make DEL 1 RETURN Prism command

into a subroutine

CUTPLANE Next thing to do it to move a cutting The CUTPLANE command leaves Avoid using the other methods plane to the places where the cut is behind everything BELOW the of Cutplane. The manual does not to be made. Think of the cutting blade. You can swivel the blade by explain them well and they cause plane as a large revolving bacon-slic- a stated angle – so if you wanted the headaches getting them to work. ing blade that has to be manoeuvred blade to leave everything ABOVE it, to the right place, and then set in you would issue a CUTPLANE 180 !RhombiCuboOctaHedron motion. You then DEL back to the command. !Stretchy Using Cutplane origin and build your model – or MATERIAL "Whitewash" perhaps set up other blades in moROTz 45 tion. FOR k=1 TO 4 ROTz 90*k Take our CUBE – you move the cutting ROTy 45 MATERIAL "Whitewash" plane to the correct place by a rotation ADDz clen ROTz 45 CUTPLANE around Z, point towards the corner by roROTy 45 DEL 3 ADDz clen tating around Y and then move out a stated NEXT k CUTPLANE amount (ADDz). Apply the CUT, then DEL DEL 1 DEL 3 3 to get back to the origin. You have to plan GOSUB 100 !Cube GOSUB 100 !Cube all this ahead, because you havent actually CUTEND: CUTEND: CUTEND CUTEND: CUTEND: built the cube yet! In the examples here, I END:!----------------END:!----------------have shown how the cursor goes to the place, and the result when it goes back. Stage 3: Get one CUT Next you need to devise a way to cut all Stage 4: Apply the CUT to all four working correctly four upper corners in one go! The FOR... corners of the top of the cube NEXT routine. ©Copyright Marmalade 1998, 1999, 2000, 2001 2.96

The GDL Cookbook 3 – Voyager

Notice in the this routine that we had to do a CUTEND after building the cube. If you don’t do this, the blades continue spinning, and the rest of the model gets cut. Each cut needs a CUTEND. In the FOR... NEXT Loop here, you have to start by an initial turn of 45, thereafter, turn at right angles to do each cut. At the end, you do 4 CUTENDS.

Controlling CUTEND In this development of the script, the idea is to set up a counter called "kut" which is incremented every time you issue a CUTPLANE command. This way, you can have FOR...NEXT loops issuing any number of Cutplane commands, and the correct number of Cutends will always be issued – in a matching FOR...NEXT Loop.

Making it into Subroutines

!RhombiCuboOctaHedron !Stretchy Using Cutplane MATERIAL "Whitewash" ROTz 45 FOR k=1 TO 4 ROTz 90*k ROTy 45 ADDz clen CUTPLANE: kut=kut+1 DEL 3 NEXT k DEL 1 GOSUB 100 !Cube FOR n=1 TO kut Stage 5: Neater way to keep CUTEND track of the NEXT n number of CUTs END:!---------

Once you have that working, you now encapsulate that whole cutting rouand to perform tine into a subroutine called 200: You need to do this, because you are going CUTEND to repeat the whole thing for the underside of the cube; whenever you have to repeat an operation, use a FOR.. NEXT or a GOSUB to save typing. Once you have got the routine at MATERIAL "Whitewash" 200: working, you can Invert it to !RhombiCuboOctaHedron !Stretchy Using Cutplane GOSUB 200 !upper 4-CUT make it cut the bottom of the cube. GOSUB 100 !Cube MATERIAL "Whitewash" Multiply the Z values by minus 1 FOR n=1 TO kut GOSUB 200 !upper 4-CUT to make it invert. The MUL comCUTEND MULz -1 mand is a ‘cursor movement’ so it NEXT n GOSUB 200 !lower 4-CUT DEL 1 needs a DEL command after. END:!----------------GOSUB 100 !Cube 100: !Make the Cube! After you have issued Cutplane ......... FOR n=1 TO kut commands, you always have to rePrism etc, etc, etc CUTEND treat back to the origin to do the ......... NEXT n RETURN next Cutplane sequence, or to END:!-------------------200: !Make the 4-CUT build the object which is to be cut. 100: !Make the Cube! ROTz 45 FOR k=1 TO 4 ROTz 90*k ROTy 45 ADDz clen CUTPLANE: kut=kut+1 DEL 3 NEXT k DEL 1 RETURN

......... Prism etc, etc, etc ......... RETURN 200: !Make the 4-CUT etc, etc, etc, etc .....

Stage 6: Make the whole CUT routine into a subroutine

The cube in the script so far has used a size of 1 meter for the cube, and a cutting distance of 0.7m diagonally from the centre. In this one the cut distance is only 0.6m.

Stage 7: The Cutting routine can now be Mirrored in Z to cut all the underside of the Cube.

This is a Stretchy Object – its dimensions are defined by A and B. Or you can type in new values for A and B. As you can also define the distance of the CUT from the origin, you can create interesting effects by interplaying the two.

This one has a cutting Here, the cut is also 0.45, but Here, the cut is 0.6, and the distance of 0.45m. The the long dimension of the long dimension of the cube cut faces now form a cube is 2 metres. is 2 metres. more predominant part of the appearance than !Rhombi 2D Script the original cube. Now it !2D script HOTSPOT2 -A/2,0 As the object is ever changhas truly become a HOTSPOT2 A/2,0 ing, give it the minimal comRhombicubocta-hedron. HOTSPOT2 0, B/2 mands required to make it HOTSPOT2 0,-B/2 stretchy. PROJECT2 3,270,2

©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Making a Cube from a Sphere: The same technique can be borrowed to have fun with making one common shape from another. The routine in this exercise has been adapted to make a cuboid from a sphere. The top picture has a cutting distance (from the origin) of 0.5 metres – it remains a sphere. The middle one is 0.4 metres – interesting. At 0.33, you get back to the Truncated Hexahedron that we were making before – with rounded corners. Finally, at 0.3 metres, the sphere becomes a cube. Note that you MUL X, Y, and Z with a single command.

In this case, the CUTPLANEs are symmetrical, and there is no difficulty in issuing all the CUTENDs at one go. However, in some more complex models, some CUTPLANEs remain in operation, other need to be ended. The order of CUTEND is similar to DEL, in that the most RECENT cut command will be ended. So if the model has many cuts, you need to plan the order of cuts carefully. ArchiCAD 6.X includes CUTPOLY, CUTPOLYA and CUTSHAPE commands which extend the power of ‘subtractive’ model making even further.

!Cube From a Sphere !Stretchy Using Cutplane MATERIAL "Whitewash" GOSUB 200 !3-CUTs MUL -1,-1,-1 GOSUB 200 !other 3CUTs DEL 1 SPHERE A/2 !Sphere FOR n=1 TO kut CUTEND NEXT n END:!------------------200: !the 3-CUT ADDz clen CUTPLANE: kut=kut+1 DEL 1 ROTx -90 ADDz clen CUTPLANE: kut=kut+1 DEL 2 ROTy -90 ADDz clen CUTPLANE: kut=kut+1 DEL 2 RETURN

Tips and Tricks Getting Strings to work correctly – initialize variables


OU may have problems with SPLIT and STR commands if GDL does not know if a variable is a string or a numeral. Parameter variables and ones already in use in the script are already known. Variables imported from an external file or table e.g. from a command like: nr=INPUT (ch, 1,1,varnam). If GDL receives varnam as "44-22-22", is it to accept it as the value 0, or is it a string for a telephone number? You can define in advance the form of a variable by initialising it. e.g. stitem=" ": lent=0 varnam1=" " etc. Then ArchiCAD will know that these varnam2=" " variables must be handled as strings and not as integers or whatever...


HERE is a new statement in AC_6.5, VARTYPE(exprn), which returns a 1 if the expression is a number and 0 if it is a string. The main use for this is in File I/O statements when reading text file from disk.

Making Patches Scaleable Laurent Godel <>: O make scaleable patches, open the PatchTemplate_65.ISM library part, included inside the ArchiCAD library. Create a new parameter called 'scal', real number type, default value 0. The parameter definition is "Output Scale (0=current scale)" Then paste these lines at the beginning of the 2D script of PatchTemplate:


!**Scaling routine** !by Laurent Godel IF scal=0 THEN scal=A_ fact=A_/scal mul2 fact,fact

Save and create a new patch. The Output Scale parameter is there. Type in a scale different from your current drawing scale and the patch will be stretched accordingly. Sorry PlotMaker... Next all you need is a GDL dimension tool that allows you to dimension the scaled patch...I have one if you need it!


Why do you need to do a Helix? This close up screw and nut was made a day before the Cookbook went to press, for an armourplated glazing assembly detail. It’s fully parametric of course, you can screw the nut (a macro) right up to the head (but not a millimetre further). You can vary the amplitude and pitch of the screwthread. The washers are stainless steel topped with neoprene body. The neoprene sleeve is omitted to show you the screw thread. This uses the techniques on the following pages. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Helix and Spiral forms Simple Tubular Helix


hese are surprisingly easy to make once you have mastered the ‘Swing the Cat’ procedure. To write out a TUBE command that did this without PUT and GET would be excruciating – it would look like some of the examples in the GDL Manual! By using PUT and GET, you build the entire sequence of pathway points, then ‘throw them’ at the TUBE command with the GET statement.

Elliptical Helix with controllable curvature The same helix can be made stretchy by using A and B. Stretching these will make the helix elliptical. It’s important that the tube section is maintained. If you took the whole object and stretched it with a MUL command, you would get fat tube and thin tube and every variation between. Using ‘Swing the Cat’, you can maintain a constant tube radius. This is a most important concept that can be applied to curved window frames, arches and curved tubular structures. As you swing around the centre, you tweak all values in the Y direction by B/A. A stepping angle of 15˚ on the first example gives the actual coil an equivalent RESOL of 24 (the tube itself is RESOL 6). If you want to control this curvature, make the stepping angle parametric. For example if the coil resolution cresl is to be 36, you can have a stepping angle of 360/cresl, of 10˚.

!Helix/Coil !3D Script RESOL 6 FOR k=-15 to 360*hit/pit+15 STEP 15 PUT crad*COS(k),crad*SIN(k),pit*k/360,0 NEXT K MATERIAL coilmat TUBE 2,NSP/4,63, 0,0,901, trad,360,4001, GET(NSP)

You start with -15˚ because TUBE needs the phantom point to get started. the final point is longer by 15˚. The 901 and 4001 polylines give a circular profile.

!Helix/Coil Elliptical crad=A/2 !Width hit=zzyzx !Height IF cresl<3 THEN cresl=3 RESOL 6 stp=360/cresl FOR k=-stp to 360*hit/pit+stp STEP stp PUT crad*COS(k),crad*SIN(k)*B/A,pit*k/360,0 NEXT K MATERIAL coilmat TUBE 2,NSP/4,48, 0,0,901, trad,360,4001, A Masking value of 63 makes the GET(NSP) tube solid, 48 leaves it hollow !3D Hotspots with each end having an ink HOTSPOT 0,0,hit line. HOTSPOT crad*COS(0),crad*SIN(0)*B/A,hit HOTSPOT crad*COS(360*hit/pit), crad*SIN(360*hit/pit)*B/A,hit

3D hotspots give you something with which to grab and stretch the coil in the 3D window. Use the start and end points of the coil. !2D Script HOTSPOT2 0,0 HOTSPOT2 -A/2,0 HOTSPOT2 A/2,0 HOTSPOT2 0, B/2 HOTSPOT2 0,-B/2 PROJECT2 3,270,2

Helix with bPRISM_ 3D Script This technique is ideal for curved walls forming the handrail of staircases. First lay out a cPRISM_ that starts at the origin and slopes upwards. The angle of the slope is that formed by the pitch of the helix and the circumference of one 360˚ rotation. By changing this to a bPRISM, we can, in effect, roll it up into a helix. With a ROTx 90, we can make it stand up. ©Copyright Marmalade 1998, 1999, 2000, 2001

You could also turn off the bounding box hotspots to make the object look tidy in plan

!Using the same parameters !as the above..... angl=ATN(pit/(PI*A)) h=hit w=hit/TAN(angl) ROTx 90 cPRISM_ coilmat,coilmat,coilmat, 5, twid, 0,0,15, w,h,15, w,h+thit,15, 0,thit,15, 0,0,-1


The GDL Cookbook 3 – Voyager

In this object, we can explore both methods. The first method can be repeated using a rectangular section. A Value list can be created to let the user decide between one method and another. In the case of the round tube, we made that to be centred along the line of the helix. In the case of the rectangular helix, we would want the outside wall of the helix to be the line of the helix if it is to be a wall. When you make the cPRISM into a bPRISM, it will become a helix with the origin at the start of the coil. It needs a few nudges to get the coil to be centred around the centre of the coil, not at its start. It will need some rotation to make oriented the same way as the Tube based helix, and will need the MULy B/A to make it stretchy, elliptically. Finally, the wall will be on the outside of the helix line. By giving a negative thickness to the bPrism, it will go to the inside of the Helix line. Experiment with this to see what I am trying to explain. Change the values and see the model change.

VALUES 'tubpris' 'Tube','bPrism'

2D Script The 2D script remains unchanged. It reveals how the section is deformed in the bPRISM based helix if you stretch it into an ellipse.

!Using the same parameters !as the above..... angl=ATN(pit/(PI*A)) h=hit w=hit/TAN(angl) ROTx 90 cPRISM_ coilmat,coilmat,coilmat, 5, twid, 0,0,15, w,h,15, w,h+thit,15, 0,thit,15, 0,0,-1 !Helix/Coil !with tube & bprism Parse the Value list, crad=A/2 !Width make a flag and use hit=zzyzx !Height IF cresl<3 THEN cresl=3 it for the subroutine IF tubpris='Tube' THEN tp=0 IF tubpris='bPrism' THEN tp=1 GOSUB 100+tp END:!________________________ 100:!Tube based stp=360/cresl FOR k=-stp to 360*hit/pit+stp STEP stp PUT crad*COS(k),crad*SIN(k)*B/A,pit*k/360,0 NEXT K m=0 !Mask the section outline MATERIAL coilmat TUBE 5,NSP/4,63+64, This is a rectangular 0,0,m, section based on ‘twid’ twid,0,m, and ‘thit’. Use m to twid,thit,m, modify the section 0,thit,m, mask. 0,0,m, GET(NSP) HOTSPOT 0,0,hit HOTSPOT crad*COS(0),crad*SIN(0)*B/A,hit HOTSPOT crad*COS(360*hit/pit), crad*SIN(360*hit/pit)*B/A,hit RETURN 101:!bPrism based ADDx A/2 MULy B/A ROTz 90 ROTx 90 angl=ATN(pit/(PI*A)) h=hit w=hit/TAN(angl) bPRISM_ coilmat,coilmat,coilmat, 5,-twid,A/2, 0,0,15, w,h,15, By connecting w,h+thit,15, the tubes with a 0,thit,15, skin (COONS) 0,0,-1 DEL 4 you can make RETURN this DNA-spiral

Rendering and smoothing issues You can see that there are some problems with rendering and smoothing. The bPRISM one looks better. If smoothing is turned on, the TUBE really messes up! If you tweak the Object Masking, you can make a difference. 63+64 turns off smoothing on the Tube object but makes the 3D drawing full of lines. It is oddly inconsistent that you can use 64 in Prisms to force smoothing ON, but in all objects that have object masking, 64 turns smoothing OFF. 2.100




1. Tube with section masking value of 0 2. Tube with section masking value of 1 3. Tube with object masking value of 63+64

4. bPrism – the best rendered appearance

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

The Spiral Helix The difference between them is that a Helix climbs upwards with a constant radius, like a coiled spring, and a Spiral moves outwards, changing its radius as it goes. In the 3D world, you can have the two combined, as in this model. The exercise builds on the previous models, but adds in some more techniques in particular, it demonstrates the use of LOCK.

2D Script and Master Script The Helix was easy as it was a circle or ellipse in plan and could easily be 2D scripted if the object was for commercial use. The Spiral is more complicated, it flies out in plan view so the 2D script needs to know the parameters if it is to know where to plant hotspots. For this, we move all the housekeeping work of parameter making and Value list parsing to the Master script.

There are still issues with smoothing. Even with 64 added to the TUBE’s object masking, you still get nasty effects. Best result requires smoothing turned off in Rendering Settings.

!Helix Spiral !Master Script RESOL resl hit=zzyzx !Height IF cresl<3 THEN cresl=3 !Error check IF resl <3 THEN resl=3 !Tube based parameters stp=360/cresl !Angular step numstep=cresl*hit/pit !Number of steps steprad=(endrad-startrad)/numstep !Different shapes Make flags by IF tubshap='Round' THEN ts=0 IF tubshap='Rect' THEN ts=1 parsing the Value list IF tubshap='I-sect' THEN ts=2

The spiral changes radius as it moves out, so you need to work out the stepping radius, i.e. the change in radius with each turn of the loop. Multiply the cresl by the number of coils to get that number !Helix Spiral Don’t forget the !3D Script zero twist angle at !Calculations moved to the end of the !the Master Script TUBE pathpoint. !Tube based - pathway points n=-1 FOR k=-stp to 360*hit/pit+stp STEP stp crad=startrad+steprad*n PUT crad*COS(k),crad*SIN(k)*B/A,pit*k/360,0 n=n+1 NEXT K m=1-tublin !Mask section outline, inverse MATERIAL coilmat GOSUB 100+ts:!Do it!! HOTSPOT 0,0,hit !3D Hotspots HOTSPOT startrad,0,hit HOTSPOT endrad*COS(360*hit/pit), endrad*SIN(360*hit/pit),hit END:!________________

This is the same loop as before, but with stepping of the radius added into the routine. The first step number is -1 because the first point is a phantom point. We use ‘n’ to keep count of the number of steps done. Because 0 is ‘show lines’ and 1 is ‘not show lines’, we have to invert the value of ‘tublin’. (see Maths Tips and Tricks) These HOTSPOT commands plant 3D hotspots in the right place, taking the last real point in the loop as the angle. ©Copyright Marmalade 1998, 1999, 2000, 2001

100:!Round TUBE 2,NSP/4,63, 0,0,900+m, trad,360,4000+m, GET(NSP) RETURN 101:!Rect TUBE 5,NSP/4,63, twid/2, thit/2,m, -twid/2, thit/2,m, -twid/2,-thit/2,m, twid/2,-thit/2,m, twid/2, thit/2,m, GET(NSP) RETURN 102:!I-Sect TUBE 13,NSP/4,63, twid/2, thit/2,m, -twid/2, thit/2,m, -twid/2, thit/2-tweb,m, -tweb/2, thit/2-tweb,m, -tweb/2,-thit/2+tweb,m, -twid/2,-thit/2+tweb,m, -twid/2,-thit/2,m, twid/2,-thit/2,m, twid/2,-thit/2+tweb,m, tweb/2,-thit/2+tweb,m, tweb/2, thit/2-tweb,m, twid/2, thit/2-tweb,m, twid/2, thit/2,m, GET(NSP) RETURN

Round tube polyline definition Rectangular tube definition with the axis of the tube centred on the section I-Section tube definition with a centre axis. This takes a little more thinking out, so draw it on paper first

This could all be done with IF statements, but is more structured with Subroutines, allowing you to build in extra levels of detail if you were developing the model further 2.101

The GDL Cookbook 3 – Voyager

3D Script See the captions on the script.

2D Script Using the same little formula that was used for the 3D Hotspots, you can plant a Hotspot accurately on the start and end of each tube, and on the centre point. If you wanted more hotspots, you could turn on Bounding Boxes, or you could show hotspots at regular intervals on the plan symbol by doing a loop at 45˚ stepping intervals for the first 360˚ of the object’s life. The script here shows how this loop is done. You can use the same loop as in the 3D script (so all the thinking has been done for you) – just set a new value for stp, and recalculate what the radius stepping value would be. In the loop, start from zero, and go either to 360, or if the spiral doesn’t actually go to 360, go to the top of the spiral. Use the MIN( ) function to ensure this. Having used PUT, it requires a small loop to make the hotspots, and this WHILE loop perfectly does it, as if you were saying: “While NSP has a value other than zero, do a hotspot by GETting 2 points from the buffer each time”.

Parameter Script The Value list lives here. The main interest here is in the use of LOCK. When the user selects a Round section, the parameters for the width and height and web are turned grey, and uneditable by the user. Similar locking is done for a choice of the Rectangular and Ishaped sections.

Property Script If this object was to appear in a listing, it is to write the short DESCRIPTOR routine, describing the user’s selection. Using the COMPONENTS statement, you could add in numerical data such as the radii, the actual tube length (for the bar benders), or the weight. As an amusement, I have added in a routine to calculate the areas of the cross section and to calculate the length of the helical spiral. You have to add an extra parameter, that of dens for Density. I have also used ArchiCAD’s built in volume calculator to compare the result. As the difference is substantial, I am not so amused, and conclude that ‘more research needs to be done”. With the I-section, the [dnc] calculation comes out heavier and with the round section, it comes out much lighter. Add one extra parameter

Basic components listing

Endnote: some mathematical purists would claim that the Spiral increases its radius by multiplying not by adding. Yes, that is another spiral form, but there’s no space left! YOU try it – have fun! 2.102

!Helix Spiral !2D Script HOTSPOT2 0,0 HOTSPOT2 startrad,0 HOTSPOT2 endrad*COS(360*hit/pit), endrad*SIN(360*hit/pit) PROJECT2 3,270,2 !2D extra quality !Pathway points stp=45 !Angular step steprad=(endrad-startrad)*(pit/hit)/8 n=0 FOR k=0 to MIN(360,360*hit/pit) STEP stp crad=startrad+steprad*n PUT crad*COS(k),crad*SIN(k)*B/A n=n+1 NEXT K WHILE NSP DO HOTSPOT2 GET(2) ENDWHILE

!Helix Spiral !Parameter Script VALUES 'tubshap' 'Round','Rect','I-sect' IF tubshap='Round' THEN LOCK 'twid' LOCK 'thit' LOCK 'tweb' ENDIF IF tubshap='Rect' THEN LOCK 'trad' LOCK 'tweb' ENDIF IF tubshap='I-sect' THEN LOCK 'trad' ENDIF

!Helix Spiral !Property Script IF tubshap='Round' THEN DESCRIPTOR 'Helical spiral, Round tube' sectarea=trad*trad*PI ENDIF IF tubshap='Rect' THEN DESCRIPTOR 'Helical spiral, Rectangular' sectarea=twid*thit ENDIF IF tubshap='I-sect' THEN DESCRIPTOR 'Helical spiral, I-section' sectarea=twid*thit-(thit-tweb*2)*(twid-tweb) ENDIF !Extra bits !Calculate Length n=0: totlen=0 FOR k=0 to 360*hit/pit-stp+0.001 STEP stp crad=startrad+steprad*n lenbit=2*PI*crad*stp/360 totlen=totlen+lenbit n=n+1 NEXT K COMPONENT 'Length of Tube(dnc)', totlen,'metres' COMPONENT 'Weight of Tube(acd)', dens*VOLUME3D(),'Kilos' sectvolm=totlen*sectarea COMPONENT 'Weight of Tube(dnc)', dens*sectvolm,'Kilos' ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

DXF conversion Convert manufacturers’ products


DL has a big future with ArchiCAD enthusiasts, but that is nothing compared with the status it will achieve if manufacturers of building products recognise it as a suitable language for 3D form – and start offering architects CDs of their product libraries in BOTH DXF and GDL. If ArchiCAD users and AutoCAD users can make equal use of the paramatric powers of the GDL products, DXF may become a distant memory, a bit like CPM and MSDOS. DXF is just so inconvenient to use compared with GDL. A GDL smart object, such as a sanitary fitting can contain the 2D plan, the 2D front elevation, the 2D side elevation and the 3D form, and a 3D wireline form all within the same object; in addition it can contain manufacturer’s data on serial numbers, weight, cost, volume, maintenance info and more; database integration that can transform the way we design, build and manage buildings. In fact, if the 3D model isn’t too voluminous (and if they come from DXF they usually are!), you can get a whole range of manufacturer’s products inside one single smart GDL object. GDL objects are so compact that they can be published on the web, downloaded in seconds, and working in the 3D model or the 2D drawings in a few mouse clicks! Graphisoft have provided the technology needed for potential users to view and test GDL objects before they download. Manufacturers can now offer live libraries on their websites – instead of showing pretty pictures, they can show working models of their products and provide every inducement for designers to specify and instal those same products. If all goes well, there should be a lot of work for years to come converting DXF drawings of manufactured products to GDL and writing products yet to come in native GDL. Let’s work out a typical procedure for doing this economically. Remember that with dozens or perhaps hundreds of products to convert, there’s no point in over-elaborating. Just get the job done efficiently. The elaboration will come when we have the leisure time to review converted objects and convert the 3D part of the GDL to native GDL. There’s is a whole manual on the subject of DXF/ DWG conversion so there is no intention to reiterate all the details – we will stick strictly to object making. DXF/DWG files are usually stored separately. A typical object, say a water closet, is represented by at least 4 files: a 3D model, a 2D plan, a 2D front elevation, and a 2D side elevation. Before we proceed. ask yourself: Do I know enough about the use of FRAGMENT2? If you do not, then mug up FRAGMENT2 quickly, it is vital to the success of this conversion. ©Copyright Marmalade 1998, 1999, 2000, 2001

DXF files are almost three times the size of the equivalent DWG file. When brought into GDL, there is some reduction, but the example featured here still finishes up as a GDL object of about 380k – unless you choose to rebuild the 3D model entirely, in which case it will reduce to a tiny fraction of the original size.

Let’s do a typical file conversion 1. Bring the file into ArchiCAD DXFs brought into ArchiCAD itself always arrive as 2D files. As your intention is to make library parts, you also have a option to open them as a library part – click this option and bring them in. Then you can copy and paste the contents of 4 such files into one single file with a bit of smart scripting to separate them. There are issues of scale – it is not uncommon for a brought-in file to be a thousand times too big or too small – depends on the scale of the original drawing. These objects (from Armitage Shanks) all come in 1000 times too big unless you tell GDL to treat 1 Autocad unit as 1.0. It’s alarming to imagine a WC that is almost a kilometre long – but thats what you could get! If you wish to bring in a 3D DXF/DWG, you could first open the 3D file as a binary library part, and add the 2D library part symbols to it. But this will be 1.5 times the file size of bringing it in as editable script, and you would only be able to have that one object in the file. If perchance you want your GDL to contain several objects (selected by a value list) then its best to 2.103

The GDL Cookbook 3 – Voyager

bring them all in as editable GDL and write some little subroutine structure to organise them. If you want to bring in dozens or more objects (perhaps an entire library of sanitary fittings), most of them will be on the manufacturer’s CD in a baffling jumble of serial or type numbers. I advise to bring them •all• into the ArchiCAD floorplan so you can survey the entire range of symbols to be converted, group them, organise them, decide which one will go together and so on; having thus organised, you may actually do the process by bringing them in as library objects.

You will be asked to find a font file – you can SKIP it

The default conversion may be 1000. Experiment. If your objects come in several kilometres wide, throw them away and reimport with a smaller conversion.

2D Plan object

2D Side Elevation object

2D Front Elevation object

3D object

2. Organising the files – move fragments OK, so you may have 4 GDL files open at once! Save them all to a library, then drop all four of them into a floor plan window. One more file, a fifth one, is the one in this exercise – open this later as a template for building your objects. The 2D objects (and the 2D symbol of the 3D object) will all be in Fragment number 1, so the task is to copy and paste the symbols into one GDL object without getting the fragments mixed up. This is a most vexing process!! It is explained here.

a. Open the GDL object with the 2D Plan. Open the 2D symbol window. We’re going to move the plan to fragment 16 as temporary parking space. On the fragment button bar, change 16 to Hidden. Now select the whole plan view and move it to fragment 16, using the popdown layer/fragment selector in the Info palette. First the Lines disappear. Do it again. Now the Arcs disappear. Do it again. Now the Text disappears. If nothing else shows, the whole symbol is now in fragment 16. Click and select here to push the 2D elements to the correct fragment Hit the Details button to hide the Bounding Box hotspots These buttons Hide or Display the Fragments, dark=visible, light=hidden None of these text bits are of interest so they can be deleted. Edit out any bit that you don’t want, and use 2D tools to tidy up as appropriate If you first hide fragment 16, you will see Lines, then Arcs then Text ‘disappear’ until the window is blank. Now you have space in fragment 1 to paste in the next 2D image The 2D symbol window actually contains 16 separate layers called Fragments. Use them here!


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

b. Open the symbol window of the Side Elevation object. Copy (or Cut) the whole symbol; return to the Plan object, open the 2D symbol window and Paste. It will be dumped into fragment 1. You are going to move the drawing to fragment 2. Hide fragment 2 in the fragment button bar, then move the whole fragment from 1 to 2 using the method described above (of repeatedly shifting each set of 2D elements). Close the Side Elevation object. c. Open the symbol window of the Front Elevation object. Do it all again (now you have got the hang of it!) and put it in fragment 3 of the Plan object. Close the Front Elevation object. d. Open the 3D script of the 3D object, Copy the whole script, return to the Plan object and Paste the whole 3D script into the 3D script window. Close the 3D object. e. Return to the Plan object, show fragment 16, and hide fragment 1, 2 and 3. Move the 2D plan from fragment 16 to fragment 1. Go on moving elements until 16 is quite empty. Save the file under a new name,

based on the objects description and number. Put it into a loaded library, one that you have created for the storage of all your newly converted files. f. Now, leaving the other two hidden, take each fragment in turn, tidy up the image, filling in missing lines, removing bad bits of text, and positioning the image correctly over the origin. Add Hotspots to each image, ensuring beforehand that you double click the hotspot tool and tell it precisely which fragment it is going into. Hotspots should be in significant corners or axes, with one in the middle for picking up. Click on the Details button in the objects title bar, and untick the Bounding Box hotspots. Set all line colours to a single colour, black will do (you can change it later from the settings box).

Learn this technique! You can have fun with this technique – you can freely download DXF models of the Eiffel Tower or Chrysler building and a host of other wonderful structures off the Internet and convert them to GDL.

3. Convert to a Smart Object Build a list of parameters for the new object. To make your life easy, use the same variable names on every occasion. You may need to add more if the objects you are making require additional definitions of material or if you are including more than one object in the same file. Now open the Conversion Template object (which we are building now), copy the significant parts of the Master script, the 2D script, the 3D script, the Parameter script and the Property script. Paste them, one at a time into the script windows of the WC Object. For the 3D bit, paste the template text ABOVE the 3D description of the object. The side and front elevations are provided for use in sections and elevations, into which you can place 2D objects. A 2D version of the plan can be shown in the 3D drawing if the user does not require a fully solid model. See the 3D script.

In this case, the font size is NOT a plotting size, it remains constant to a real dimension, whatever the scale Because label is an option, the fine details are hidden inside a cascading set

!DXF/DWG Conversion Template !Master script

Value lists can be in the Parameter script or the Master script. Put them first.

VALUES 'show23' '3D model', '2D plan','2D side view','2D front'

Parse the Value list and convert to flags

VALUES 'fnam' 'Geneva','Arial','Times', 'Verdana','Helvetica','Georgia','Courier' IF IF IF IF

show23= show23= show23= show23=

'3D '2D '2D '2D

model' plan' side view' front'


dt=0 dt=20 dt=21 dt=22

x=REQUEST("Rgb_of_pen",matpen,pred,pgreen,pblue) DEFINE MATERIAL "Body_Shiny" 4, pred,pgreen,pblue bodymat=IND(MATERIAL,'Body_shiny') desc_str1='Armitage Shanks WC 601'!for listing desc_str2='WC 601' !for 2D symbol DESCRIPTOR desc_str1 ©Copyright Marmalade 1998, 1999, 2000, 2001

Extract a colour. If your manufactured objects have special ranges of colours (say three colours for a lamp, black, white and dark green) you might have to build those materials with Define, and make a Value list to select them. In this example, the Pen colour can be analysed into Red, Green and Blue, and converted into a colour. ‘Plastic’ usually gives the best results for home-made materials. Text descriptions, insert one to appear in a listing, and another as an optional label in the 2D symbol. For the moment this is the minimum you need for the Property script, unless your client wants to go overboard with greater levels of detail. 2.105

The GDL Cookbook 3 – Voyager

2D Script Standard title is pasted in at the top. Insert the title of the particular object you are making. Pen can be set in the user’s settings box, and write the Key hotspot If the user wants a label, you need to define style. In this case, font size is autosizing, even if the user changes scale. At smaller than 1/100 scale, the label disappears. The label is on two lines, you may want to adapt this to your own needs. If the object is in 2D in Plan or 3D then it will use Fragment 1. The zero flag allows the user to set the colour from the main object settings box. Use the Project2 to nudge the 3D object to fit the 2D plan symbol. !DXF/DWG Conversion Template !3D script !Open Each file first as an object. Unit is 1 millimetre. !Then open the 2D objects one at a time and drag 2D into !fragments 1, 2 and 3 of the 2D Plan object. Edit the !2D images and ensure that they fit. Copy 3D !script into 3D script of 2D Plan object. !Resave 2D plan object as final new object. !Build Parameter table and value lists for new object. !Copy over Master, 2D and 3D script bits from the !Conversion Template object. Nudge 3D to fit. !Untick the box for Bounding Hotspots, plant your own !Test Object – tune object. PEN pcol3 MATERIAL bodymat ADD -0.393/2,-0.700,0 !nudge into position IF dt=0 THEN GOSUB 100 ELSE GOSUB 200 DEL TOP END!------------------------------------100:!3D solid model PLANE_ 3, 0.299818, 0.035215, 0.452023, 0, 0.320588, 0.045317, 0.452023, 0, 0.160630, 0.020968, 0.452033, 0 PLANE_ 3, 0.299818, 0.035215, 0.452023, 0, 0.160630, 0.020968, 0.452033, 0, 0.195927, 0.020968, 0.452035, 1 PLANE_ 3, 0.012636, 0.351726, 0.452027, 0, 0.019182, 0.167628, 0.452024, 0, 0.384218, 0.443323, 0.452026, 0 PLANE_ 3, 0.039468, 0.621380, 0.731770, 0, 0.048015, 0.560041, 0.746757, 0, 0.045833, 0.621251, 0.745732, 1 !...... and so on for thousands of lines until it ! finishes describing every damned polygon!! RETURN 200:!2D view of plan PEN pcol3 LIN_ 0.194345, 0.700254, 0, 0.371504, 0.700254, 0 MODEL WIRE ADDX 0.371504 ADDY 0.680254 ARC 0.020000, -1.832342, 90.000000 DEL 2 LIN_ 0.391493, 0.679614, 0, 0.386457, 0.522175, 0 LIN_ 0.386457, 0.522175, 0, 0.368389, 0.511478, 0 LIN_ 0.368389, 0.511478, 0, 0.365417, 0.466724, 0 ADDX 0.355439 ADDY 0.467387 ARC 0.010000, -86.968877, -3.799346 DEL 2 !.... and so on until every line is included RETURN


!DXF/DWG Conversion Template !2D Script !Armitage Shanks !WC range PEN L_ HOTSPOT2 0,0 IF labl THEN IF A_<101 THEN DEFINE STYLE 'labl' fname, fsiz*1000/A_,2,0 SET STYLE 'labl' TEXT2 0,0,'ArmSh' TEXT2 0,-fsiz*1.1,desc_str2 ENDIF ENDIF IF dt=0 OR dt=20 THEN !Plan FRAGMENT2 1,0 ENDIF IF dt=21 THEN !Elevation Sideview FRAGMENT2 2,0 ENDIF IF dt=22 THEN !Elevation Front FRAGMENT2 3,0 ENDIF !!!project2 3,270,2

3D Script As you may not have your Cookbook to hand all the time (shame!) then include a summary of the instructions at the top of the script. You may need them again. Set the Pen, set the material (that you built in the Master script) The ADD command is an offset to make the 3D fit over the 2D. Use Project2 in the 2D. The offset here is actually half the width of the WC and the full length. As the DXF for this WC kindly provided a 2D version of the WC that would appear in 3D if the solid object was not required, it has been separated into another subroutine 200. If it hadn’t provided one, you could place the 2D plan symbol over the origin, explode it, drag into the 2D script, form it into a subroutine and you have made your own 2D image for use in the 3D drawing. Since the 3D object could have thousands of polygons, it’s wise to allow the designer to place 2D objects in the 3D environment and only show them as solid when 3D renderings are required.

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Desktop Clock

/ Filestamp Adventures in 2D GDL Scripting This covers: REQUEST, Defining Style, Value List, Making fonts to autosize to drawing scale.


LTHOUGH all of us enjoy the luxury of a clock displayed on the menu bar of our computer or on our wrists, this clock is useful because it can be scaled to fit the building you are working on, or the scale of the document for plotting. So it will accurately datestamp the time and date of a Plot. It gets updated everytime there is a Reload of the file. This has been adapted to show Project Name.

Parameters Offer a choice – If you are plotting, you can fix the size to the Plot, and then the height in millimetres will be the height of the text. If you tick the box to fit the Plan, it will always relate to the size of the building, whatever the scale of the drawing. Plotting height is defined strictly in millimetres, you must set the Type as a number, not dimension. Use a Value List for the Plot/Plan choice. A and B are not used. The user can display just a title box without a clock.

REQUEST The REQUEST command must be amongst the most difficult of all the GDL commands, since the manual provides an example that is itself in error – and the DateTime routine does not appear in the manual anyway. Read the DateTime Readme file in your Graphisoft folder for deeper information. The ‘x=’ before REQUEST creates a value for x of 1 or 0 if the command succeeds. It is not necessary, but reports an error if you do not use a dummy variable. Use any letter not already in use, if not x.

STW( ) is a way of determining in metres, the length of a string when printed on the page in the defined style. It is difficult to set the clock size to follow the Plot or the Plan, and the script here is the result of much trial and error research – but it works! Many people use this!

Comment GDL doesn’t have a VAL( ) function to convert text strings into numbers like BASIC. The Time and Date info, even when apparently returned in numbers, is actually a string. GDL’s SPLIT( ) command is the equivalent to VAL( ). With SPLIT to read numbers, you can make an analog clock with revolving hands. (Ana-Clock by Trevor Grant 1999)

©Copyright Marmalade 1998, 1999, 2000, 2001

!Desktop clock/ Filestamp IF clockshape='Project Title' THEN clkshp=1 IF clockshape='Clock and Project' THEN clkshp=2 IF clockscale='Scale to PLOT' THEN clspln=1 IF clspln THEN htx=htxt ELSE htx=htxt*10/A_ PEN projpen DEFINE STYLE 'clock' fontnam,htx,1,(1-clkshp/2) SET STYLE 'clock' x=REQUEST('Height_of_Style','clock',height) len =STW('day 00 mon year')*A_/1000 hit= height*A_/1000 !Hotspots In Europe, AC plots in HOTSPOT2 0, 0 millimetres, but my readers in HOTSPOT2 0, hit USA can adapt this to points. HOTSPOT2 len,hit IF clkshp<>1 THEN x=REQUEST('DateTime','%a %d %b %Y',dstr) x=REQUEST('DateTime','%X',tstr) !Display date and time ‘dstr’ is the Date String TEXT2 0,0 ,dstr TEXT2 0,hit,tstr ‘tstr’ is the Time String !Body of Clock ARC2 0.0,0,hit,90,270 ARC2 len,0,hit,270,90 LINE2 0, hit,len, hit LINE2 0,-hit,len,-hit HOTSPOT2 0, -hit HOTSPOT2 len, -hit HOTSPOT2 -hit, 0 HOTSPOT2 len+hit, 0 HOTSPOT2 len/2, 0 ENDIF !Show Project Name IF clkshp THEN IF clkshp=1 THEN ADD2 0,-hit DEFINE STYLE 'title' fontnam,htx*1.6,2,1 SET STYLE 'title' x=REQUEST('Name_of_plan','',filename) TEXT2 len/2,hit*2.5,filename HOTSPOT2 len/2, hit*2.5 HOTSPOT2 len/2, hit*1 ENDIF VALUES 'clockshape' 'Clock Only', 'Project Title','Clock and Project' VALUES 'clockscale' 'Scale to PLOT', 'Scale to PLAN'

Put this in the Value List script

Use this to mark up your drawings 2.107

The GDL Cookbook 3 – Voyager

Analog Clock GDL by Trevor Grant


HIS beautiful clock by Cookbook reader Trevor Grant actually keeps time. Everytime you do a rebuild, it updates – second by second. In fact, it’s so much fun, I don’t get any work done. I sit here all day going Rebuild... Rebuild... Rebuild.... You can interrogate your computer’s system to find the time and date using REQUEST, but the result comes as a string (text) not as a number. Trevor sent me an early version in which he laboriously used string parsing to find out the time and date before building the clock. I pointed out to him the wonderful SPLIT( ) command. Within a day or two, he had completely rewritten it using SPLIT in a fraction of its previous size. SPLIT extracts digits from a string, and if they are numeric, it passes their real value to a variable. If they are alpha characters, the variable is given a value of zero. If you can predict accurately the composition of a string (where digits will occur), this is an excellent technique. It’s valuable for parsing Value lists, and it’s good for parsing REQUEST statements. !Analog Clock2 – using 'SPLIT() Initialise !by TIGrant 1999 variables. It’s not always PEN pcol !Initialise variables necessary in theString=""!number as string normal GDL, theNumber=0 !number as number but is good n=0 when you are B=A !A width X=Y height B handling r=A/2 !clock face radius strings. From h=r/10 !clock depth the start, you hourStr="" establish that a minsStr="" variable will secsStr="" !times as strings be a string, !Get the Time x=REQUEST("DateTime","%I",hourStr) and it avoids x=REQUEST("DateTime","%M",minsStr)spurious error x=REQUEST("DateTime","%S",secsStr) messages !Do hours/mins/secs theString=hourStr GOSUB 123 !Split! The REQUEST hour=theNumber statement is the theString=minsStr GOSUB 123 !Split! the brain mins=theNumber behind this theString=secsStr script GOSUB 123 !Split! SPLIT( ) is secs=theNumber contained in !3D Build the Clock subroutine 123 ROTX 90 : the beating MATERIAL ColFace heart of the RESOL 36 !for the clockface script CYLIND h, r !Face Now it’s the task MATERIAL ColHands of building the CYLIND h*0.99, r*1.05 !Rim 3D clock face !Axle/hub and hands RESOL 12 !for the hub ADDZ h*1.01 !i.e. just above clock face MATERIAL ColHands CYLIND h*2, r/15 ADDZ h*1.45 MATERIAL ColSecs CYLIND h/2, r/10 DEL 1


!Number Markers DEFINE STYLE can be used MATERIAL ColHands in 3D lettering t=r/30 tt=t th=r/5 mk=r*0.75 DEFINE STYLE "aStyle" fontnam,th*1000,7,0 SET STYLE "aStyle" ADDX -th ADDY mk VALUES 'fontnam' 'Arial', TEXT tt, 0, "12" 'Times' DEL 2 ADDX mk+th/4 Put this Value list into the ADDY -th/2 parameter script. Add more fonts TEXT tt, 0, "3" DEL 2 if you like ADDX -th/2 ADDY -mk-th TEXT tt, 0, "6" This section could also (like the DEL 2 ADDX -mk-th one below) be shortened with a ADDY -th/2 PUT statement but let’s not get TEXT tt, 0, "9" too geekish! DEL 2 !Intermediate hour dot markers RESOL 6 mkk=mk*1.15 !Radius from Centre !Put Angles where we want dots PUT 30, 60, 120, 150, 210, 240, 300, 330 mkk=mk*1.15 REPEAT ADD mkk*SIN(USE(1)),mkk*COS(GET(1)),0 CYLIND t, t DEL 1 UNTIL NSP=0

I have rewritten this hour dot markers section for Trevor. He laboriously posted 8 separate hour markers, requiring 28 lines of code. This demonstrates how PUT and GET and a Loop can dramatically shorten a script. USE allows you to use a number once. The second time, it is removed from the buffer with a GET statement. Repeat... Until is the best form of loop to use when using PUT&GET ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager IF showName THEN !makers name, etc DEFINE STYLE "anoStyle" fontnam, 1000*th/4,7,0 SET STYLE "anoStyle" ADD -mk/3,-mk/1.5,0 TEXT tt, 0, "AnalogClock" ADDY -th*1.75/4 TEXT tt, 0, "©TIGrant" DEL 2 ENDIF !Hands !Hour angH=(30*hour)+(0.5*mins) ADDZ t*1.1 ROTZ -angH l=mk*0.66667 w=th*0.66667 MATERIAL ColHands PRISM 4, t, -w,0, 0,l, w,0, 0,-w*1.5 DEL 2 !Mins angM=(6*mins) ADDZ t*2.2 ROTZ -angM l=mk*1.1 w=th*0.5 MATERIAL Colhands PRISM 4, t, -w,0, 0,l, w,0, 0,-w*2 DEL 2

!Secs angS=(6*secs) ADDZ t*3.3 ROTZ -angS l=r*0.9 w=th*0.25 MATERIAL ColSecs PRISM 4, t, -w,0, 0,l, w,0, 0,-w*5 DEL 2 DEL TOP END:!_______________________________ !Subroutine – does all the hard work!! 123: !the string to number using SPLIT( ) n=SPLIT(theString,"%n",theNumber) RETURN ! Analog Clock 2 – 2D Script ! by TIGrant 1999 ! Offered to users of the GDL Cookbook HOTSPOT2 HOTSPOT2 HOTSPOT2 HOTSPOT2 HOTSPOT2 HOTSPOT2

0,0 -A/2,0 A/2,0 0,-A/20 0,-A/10 0,-A/6.75

Note: If it’s stretchy, always put the hotspots first!

PROJECT2 3,270,2

Endnote A reader of the Cookbook in Australia used this clock – put it up into a church tower. It was only after he had been working on the model some days that he noticed that it was always showing the right time!

Fountain T

HIS is a superb piece of work by Frank Chin which shows GDL as a calculation machine – it calculates droplet pathways according to ballistic formulae and applies random numbers to simulate the chaos of drop dispersal. !Fountain created by Frank Chin !Formulae !v=u+at u=initial velocity !s=d+ut+1/2*a*t^2 v=velocity at point !d=initial distance These are the basic !s=distance at point formulae for !a=accerelation=gravity=-9.81 projectiles !t=time MULY b/a RESOL resl MATERIAL mtl !Time for droplets to hit the water tt=(SQR(2*9.81*ht1)+SQR(2*9.81*ht1-2*9.81*ht2))/9.81 FOR j=1 TO nub FOR t=1 TO nuw/3 tme=RND(tt/2) dirx=a/(2*tt)*tme dirz=SQR(2*9.81*ht1)*tme-9.81/2*tme^2 !Disperse the water-drop ROTZ RND(angd)-angd/2 MULX 0.97+RND(0.06) MULY 0.97+RND(0.06) ADDX dirx ADDZ dirz SPHERE rdus DEL 5 NEXT t ©Copyright Marmalade 1998, 1999, 2000, 2001

!Twice as much water on way down FOR t=1 TO nuw/3*2 tme=tt/2+RND(tt/2) dirx=a/(2*tt)*tme dirz=SQR(2*9.81*ht1)*tme-9.81/2*tme^2 !Disperse the water-drop ROTZ RND(angd)-angd/2 MULX 0.97+RND(0.06) MULY 0.97+RND(0.06) ADDX dirx ADDZ dirz SPHERE rdus DEL 5 NEXT t ROTZ 360/nub NEXT j DEL TOP

Endnote 2D Script is just a Project2, but for the purist, a circle with some radiating lines might be a good symbol. Also, one could follow this by building the water pool as a MASS command, and providing a ‘spattering’ algorithm to roughen the surface where the droplets were calculated to fall. 2.109

The GDL Cookbook 3 – Voyager

Curtains! C

URTAINS are always a problem when the CAD en vironment is made of hard polygons. How do you make something look soft and flowing? Sometimes it’s better to map a texture onto a surface than to try to model it geometrically in all its detail. Here is a half way solution. It builds a geometric curtain, but gives the user good control over polygons, looks realistic, and when you ‘draw the curtains’ in the 3D window, it is uncannily realistic. This curtain is a reduced version of a commercial curtain object I have written. The real curtains have top tufting, a metal rail in different styles, rings, a heavy hem. This curtain demonstrates: • Trigonometry in action • The power of the RULED command

Planning The design approach is to trace out a SIN wave along the foot of the curtain, count the number of points resulting, and replicate exactly the same number of points at the top, but this time, doing it as a stretchy Zig-zag form. Using a RULED, you just join the two lines together.

Parameters The parameter box is built with cascading buttons. The curtain could hang vertically, but in case it’s against a wall, there is an offset at the top. The other parameters are for controlling the number of billows, the wave amplitude, polygon smoothness and 2D appearance.

Master Script There are some calculations to be done to parse the Value list and to calculate the waviness of the curtain SIN wave.

3D Script Because this is part of a larger object, only subroutines 200 and 400 are retained. The routine runs along the SIN wave, storing values repeatedly until it reaches ‘A’, the end. It counts these up (k=NSP/3) and then pro!Master Script !Pleat Offset IF offst='Centrally aligned' THEN ot=0 IF offst='Aligned to wall' THEN ot=1 !Curvature IF smooth<1 THEN smooth=1 IF smooth>5 THEN smooth=5 !Details of fold numfold=numfold-1 IF numfold<3 THEN numfold=3 bnum=smooth+3 !Bit number/billow wlen=A/numfold !Wavelength wrad=wlen/4 !radius of wavebit angb=180/bnum !angular distribution tz=zzyzx !height of curtain !Top offset tofset=(wcurt/2-wfold/8)*ot


VALUES 'offst' 'Centrally aligned', 'Aligned to wall'

RULED doesnt provide a way of removing the edgeline between billows, but you can turn the top and bottom lines on

!Long hanging Curtains! 3D Script PEN pcol GOSUB 200:!Main Curtain element GOSUB 400:!3D Hotspots END:!----------------------200:!Main Curtain element MATERIAL cmatl FOR d= 0 TO A+0.01 STEP wlen FOR n=180-angb TO angb STEP -angb PUT d+wrad*COS(n), PUT wrad*SIN(n)*wcurt/wrad,(1-sl) NEXT n FOR n=180+angb TO 360-angb STEP angb PUT d+wlen/2+wrad*COS(n) PUT wrad*SIN(n)*wcurt/wrad,(1-sl) NEXT n NEXT d k=NSP/3 flen=(A+wlen/2)/(k/2) !fold length FOR n=1 TO k/2 PUT flen*(n-1),tofset-wfold/2,tz !Zig PUT flen*(n-1)+flen/2,tofset+wfold/2,tz !Zag NEXT n RULED NSP/6,16,GET(NSP) RETURN 400:!3D Hotspots HOTSPOT 0,0,tz HOTSPOT A,0,tz HOTSPOT wrad,0,zzyzx HOTSPOT A/2,0,zzyzx HOTSPOT A-wrad,0,zzyzx RETURN ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

duces a zigzag pattern to match, at the top. The numbers for a bottom and top of a RULED go in the same direction so this is easy. It would also be possible but harder if using a COONS statement, but why do that if a RULED will do it just as well? The 3D hotspots are valuable because they make it easier to grip the curtains when you are ‘drawing’ them. Remove the bounding box hotspots.

Endnote : forward to greater heights! The range of curtains in a building could be considerable and would be a nuisance for the user to keep having to build materials. If there was a known range of fabrics available, you could have a User Interface presenting the range of fabrics. The user could select a fabric, the texture would be made and mapped to the curtain – thus removing the need for the user to make their own Material in the Options menu. Thats’s where we shall go next!

!Long hanging Curtains !2D Script PEN L_ HOTSPOT2 0,0 HOTSPOT2 A,0 HOTSPOT2 0,tofset HOTSPOT2 A,tofset HOTSPOT2 A/2,0 !Centre line FOR k=1 TO numfold ADD2 wlen*(k-1),0 LINE2 0,0,wrad,0 DEL 1 NEXT k PEN pcol CIRCLE2 0,0,0.01 CIRCLE2 A,0,0.01 CIRCLE2 0,tofset,0.01 CIRCLE2 A,tofset,0.01 PROJECT2 3,270,1

The circles are here to make it easier to pick up and stretch the curtains

Built in Textures and the User Interface


HENEVER providing a choice to the user which involves a visually based decision, consider offering them a pictorial Value list. The first time you do this, it is very difficult, but once you have got one working, you can copy and paste to make the later ones easier to build. The GDL-CB contains an increasing number of examples which you are welcome to borrow. • Find your textures. I have found 4 examples here. • Save them in your project library in equally sized rectangles which repeat at edges. These tiles are 200 x 200 pixels. They are also copied onto a single bitmap tiled image, and the whole tile image is resized to 280 x 280 which is ideal for a User Interface. • Build a Value List that contains the filenames of the textures. Build a few more parameters, allowing the user to choose between predefined Material or a Texture. • Update the Master script to include the Texture and Material definitions. Read ahead to the section on COOR and VERT for more detail. • Modify the 3D script to set material according to the user’s choice. • The user interface script is easy once you have done a couple. Use some trial and error for the final adjustments of the tile sizes. UI_DIALOG "Curtains, stretchy" UI_INFIELD 'ctxtr',12,16,286,150, 1,'curtain_textrs.jpg',4,2, 130,140,120,120, 1,'Morocco.jpg', 2,'Tartan.jpg', 3,'Redtile.jpg', 4,'Mensa.jpg' UI_STYLE 1,1 UI_OUTFIELD 'Please Choose your Fabric', 12,170,200,30

The textur e images are 200x200 and the tiled selector image is 280x280

VALUES 'matex' 'Material','Texture' VALUES 'ctxtr' 'Morocco.jpg','Tartan.jpg', 'Redtile.jpg','Mensa.jpg'

Add these lines to your Value List Add these lines to the Master Script !Curtain Texture Definition IF scatx<1 THEN scatx=1 !Set a limit IF scatx>5 THEN scatx=5 !to scaling DEFINE TEXTURE 'curtextr' ctxtr, 0.3*scatx,0.4*scatx,1,0 Read ahead for DEFINE MATERIAL 'curtmatl' 24, more about 0.5,0.5,0.5, DEFINE TEXTURE 0,61,IND(TEXTURE,curtextr)

Modify the 3D script starting at subroutine 200 200:!Main Curtain element IF matex='Material' THEN MATERIAL cmatl IF matex='Texture' THEN MATERIAL 'curtmatl'

This is the User Interface: please try it out ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Spiral Handrail (Swing the Cat again!) T

HIS handrail is similar to the ‘Long Handrail’ earlier in the Cookbook, but this one goes further in that it follows a spiral staircase and has more sophisticated treatment of the ends and the infil panel. Again, you must use TUBE to make the object because ELBOW is too feeble. As for the previous handrail exercise, you can ‘Swing the Cat!’ You need the FOR...NEXT loop and SIN and COS to organise the angular distribution of elements, in this case, the points on the handrail, the downrights of the handrail and the points on the Infil Panel. Yes, for GDL nutcases, there is the chance to try a COONS object, the infil panel. By the way, this is a mega useful object, and worth buying the Cookbook for on its own! With the long handrail, you had a constant height – in this case, if you know the start and end height, your routine can work out the inbetween heights.

Parameters & Master Script First establish the basic geometry of the circle. This is to be stretchy, based The infil panel can be glass, or you can apply on a CHORD of a circle, the width being A and the bulge being B. an alpha channeled wiremesh texture These algorithms for calculating the Radius and sweep angle are in the Maths Primer.

!Handrail !Master Script !Parameters for handrail IF chunk<3 THEN chunk=3 angl=(90-ATN((A/2)/B))*2 !Sweep angle crad=(A/2)/SIN(angl) !Curve Radius trad=diam/2000 !HRail Tube Radius angd=angl*2/chunk !angle difference hitd=zzyzx/chunk !height diff/chunk !Parameters for downrights & ends & infil dnrad=ddiam/2000 !Downright Radius dnnum=ABS(dnnum) !make it positive IF dimen<trad THEN dimen=trad IF endstyl='Butt cut ends' THEN es=0 IF endstyl='Downward Elbows' THEN es=1 IF endstyl='Rounded ends' THEN es=2 IF dropin<0 THEN dropin=0 IF lenin<=dropin THEN lenin=dropin+0.001 IF dnnum>1 THEN angdw=angl*2/(dnnum-1) !angle diff hitdif=zzyzx/(dnnum-1) !height diff ENDIF !avoid divide by zero error !Parameters for ends !sloping angle at end anglen=ATN(hitd/(2*PI*crad*angd/360))

This first bit is all you need at first to get the handrail working. Do the downrights later.


This is all it takes to make a lovely !Handrail Sloping !Round with infil stretchy 3D handrail for a spiral !3D Script staircase (although it depends on the master script for the angles and PEN pcol the 2D script for the hotspots !Tube locations h=-hitd !height counter FOR k=-angl-angd TO angl+angd+0.2 STEP angd PUT crad*SIN(k),crad*COS(k),h,0 h=h+hitd Radius is used here instead of NEXT k Resol because later we are dealing !Draw the handrail RADIUS trad*0.7,trad*1.4 with elbows and ellips to treat the handrail ends ADDy -(crad-B) MATERIAL matl V A L U E S 'endstyl' 'Butt cut ends', BODY -1 'Downward Elbows','Rounded ends' TUBE 2,NSP/4,63, 0,0,901, V A L U E S 'infil' 'Infil Panel', trad,360,4001, 'NO Infil Panel' GET(NSP) As always, use Value Lists to ensure BODY -1 that your objects are user friendly DEL 1 !Downrights !3D script IF dnnum THEN ADDy -(crad-B) FOR k=1 TO dnnum ROTz angl-angdw*(k-1) ADD 0,crad, hitdif*(k-1) ROTx 180 CYLIND dnlen,dnrad DEL 3 NEXT k DEL 1 ENDIF

Handrail 3D A FOR...NEXT Loop runs through, calculating all the points along the handrail. Do not forget that for a TUBE, you have a phantom Start and End point. Using PUT & GET, it is almost impossible to get an error. But I still advise the use of the BODY -1 command, to be sure.

Downrights 3D The first FOR... NEXT loop was based on angle, this one is based on number.

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager !Handrail Ends 3D ADDy -(crad-B) s=(-1) !'s' is the flag GOSUB 100:!Handrail end ADDz zzyzx s=(+1) GOSUB 100:!Handrail end DEL 2 END:!------------------------100:!One Handrail end ROTz -s*angl ADDy crad ROTy s*(90-s*anglen) ROTz -180*(s-1)/2 GOSUB 110+es DEL 4 RETURN !End Treatments 110:CYLIND dimen,trad!Butt-end RETURN 111:CYLIND trad,trad !Elbows ADDz trad ELBOW dimen,90+anglen*s,trad DEL 1 RETURN 112:CYLIND dimen,trad!Rounded ADDz dimen ELLIPS trad,trad DEL 1 RETURN

Handrail Ends 3D This is an example of using Value Lists and using flags (in this case ‘s’) to toggle values and angles. I suggest three methods, as a simple end of the handrail results in a very ugly detail where it meets the downrights. It’s difficult to write code like this straight off. You get each handrail end working as two routines. So you discover that the difference between the routines is some pluses and minuses here and there. By using the flag (‘s’) you can toggle the angles and rotations and do the both with the same routine. These toggling routines are contained in the Tips & Tricks in the Voyager Maths Primer. To do one of the three choices for an End-solution, the flag ‘es’ is used to decide which subroutine to run.

2D Script As the object is stretchy, place the hotspots FIRST in the script. Use PROJECT2 (although a 2D script with ARC2 could be written if you have time). The downrights need hotspots, and if there are no downrights, you need little circles to help the user find the stretching points.

©Copyright Marmalade 1998, 1999, 2000, 2001

Additional Parameters for Downrights and Infil Panel !Glass locations for COONS infil IF infil='Infil Panel' THEN !Points 1 to 2 h=-dropin !height counter PUT crad*SIN(-angl),crad*COS(-angl),-dropin FOR k=-angl+angd TO angl-angd+0.002 STEP angd h=h+hitd PUT crad*SIN(k),crad*COS(k),h NEXT k PUT crad*SIN(angl),crad*COS(angl),zzyzx-dropin !Points 4 to 3 h=-lenin !height counter PUT crad*SIN(-angl),crad*COS(-angl),-lenin FOR k=-angl+angd TO angl-angd+0.002 STEP angd h=h+hitd PUT crad*SIN(k),crad*COS(k),h NEXT k PUT crad*SIN(angl),crad*COS(angl),zzyzx-lenin !Points 1 to 4 PUT crad*SIN(-angl),crad*COS(-angl),-dropin PUT crad*SIN(-angl),crad*COS(-angl),-lenin !Points 2 to 3 PUT crad*SIN(angl),crad*COS(angl),zzyzx-dropin PUT crad*SIN(angl),crad*COS(angl),zzyzx-lenin ADDy -(crad-B) MATERIAL matin BODY -1 Infil Panel 3D: COONS can make COONS 17,2,63, it! It has the Power! Another method GET(NSP) BODY -1 (slightly easier) would be bPRiSM_, ENDIF but you need care in calculating and

locating it. Follow the routine I advocate in the tutorial on COONS (1–>2,4–>3,1–>4,2–>3). Use a similar FOR...NEXT routine to the one used for the TUBE. Due to a bug in ArchiCAD !Handrail !2D Script 6.5 and 7.0’s DWG export PEN pcol translation it’s best to HOTSPOT2 0,0 avoid ROT2 in 2D scripts. HOTSPOT2 -A/2,0 The use of Trig (as here) HOTSPOT2 A/2,0 r eplaces the need for HOTSPOT2 0,B !display stretchspot location ROT2. The right hand routine is the corrected CIRCLE2 0,B,diam/6000 version, the left is easier to PROJECT2 3,270,2!DRAW IT!! think out and write. !Downrights IF dnnum THEN !downrights ADD2 0,-(crad-B) FOR k=1 TO dnnum FOR k=1 TO dnnum ROT2 angl-angdw*(k-1) ADD2 crad*SIN(angl-angdw*(k-1)), ADD2 0,crad crad*COS(angl-angdw*(k-1)) HOTSPOT2 0,0 HOTSPOT2 0,0 CIRCLE2 0,0,dnrad CIRCLE2 0,0,dnrad DEL 2 DEL 1 NEXT k NEXT k DEL 1 ELSE !stretchspots CIRCLE2 A/2,0,diam/6000 CIRCLE2 -A/2,0,diam/6000 ENDIF


The GDL Cookbook 3 – Voyager

Curved Windows – the hidden secrets


URVED windows are difficult enough to make in real life, but they are also difficult in ArchiCAD! The GDL reference manuals contains an example which defies explanation. Let’s look at the hidden secrets of curved windows and work out simple formulae for solving them. The fundamental rules for curved windows (and doors) are here, and once you know that, you can work out many of the essential parameters for building a window. There is still some trigonometry and geometry to do. The best tool for window making is bPRISM_ because you can lay out a window just as you might lay out a straight wall window, and the radius is known to you. You need to do some acrobatics to get round the fact that the origin is not on the face of the window, but at the midpoint of the chord.

Rules for Curved Windows/Doors • The dimension A is not in the curve of the wall, it’s in the length of chord that joins the edges of the reveal in the ‘hotline’ of the wall. • The Origin of the window is at the centre of the window, but not where you would expect – at the centre on the perimeter. It’s at the midpoint of the chord between the reveal edges on the ‘hotline’ of the wall. • The Global Variable called WIDO_ORIG_DIST (also known as R_) is not the radius of the wall, as you would expect, but the distance from the centre of the Wall to the Origin of the Window. • Thankfully, B is unchanged – it is the height of the wall. • The actual radius of the wall can be found with a Pythagoras calculation using the half chord width and the global variable R_. • The Sweep angle of the window can be found because there is a right angle triangle in the diagram – it is ArcTan of the half chord divided by the R_ global variable. • The edges of the curved window, not the centre of the window, are required to be level with the origin.

!Curved window experiment !3D Script r1=ABS(R_) !make it positive IF r1<fdep THEN r1=1 !make it work when not in plan ang=ATN((A/2)/r1) !half angle subtended wrad=SQR((A/2)^2+r1^2) !Actual Wall radius A2=2*PI*wrad*ang/360 !Actual width of window bulg=wrad-r1 !bulge of window beyond chord !print ang,R_,A2,A !Test

Parameters Enter these first, so that you will not get an error when you test your script. Then in the 3D script or the Master Script, you must do some calculations for parameters which are not in the box. • Depending which way round the wall is, the global R_ is often a negative quantity. Make it positive with the ABS function. • Give R_ a temporary value while you built the object. If R_ is smaller than the frame depth, let it equal 1 metre. In the GDL environment, R_ is zero and it impossible to run your script as you will get ‘divide by zero’ errors. 2.114

• ‘ang’ is the sweep angle of half the window. This is easily derived using ArcTan of the two sides with known values. • Wall radius ‘wrad’ is easily calculated using Pythagoras. • The half width of the window ‘A2’ measured along the perimeter can be calculated from the radius and sweep angle. • When you build the window, you need to sink it below the ground plane so that the outer edges are level with the origin – so you need to know the ‘bulg’ of the window – the distance from the centre to the chord connecting the edges. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

3D Script – the 4 tricks First task is to make a frame, but if you use bPRISM_ you get a shape like the top view. The prism curves downwards and the origin is at the centre of the window. You need four tricks to make the window work out correctly. • First, you have to lower it by the value of ‘bulg’ – so that the edgesof the curved frame are level with the XY ground plane. • Second, you have to use MULz -1 to mirror the curved frame – so that it curves upwards. This is how it should be to sit in the wall correctly.

Your first effort – curving the wrong way and with the origin at the centre.

• Left like this, the window will project BEYOND the face of the wall. So the third trick is to give the bPRISM a negative thickness value. Amazingly, this works. It is allowed to have negative thickness because if it didn’t, it wouldn’t be possible to make certain objects such as spiral staircases – or curved windows. • The default curvature of anything in ArchiCAD is 36, but this means one polygon for every ten degrees of sweep. This is in fact desperately coarse, and looks very bad on a bPRISM_. To get any quality of appearance, you need to reduce this to at most 5 degrees. A RESOL command of 72 will achieve this. !continued from previous page RESOL 72 !Same as wall 4 tricks – elevate, mirror, PEN pcol3 negative thickness and ADDz -bulg resolution MULz -1 bPRISM_ fmat,fmat,fmat,– A2 is the half width of the 5+5,-fdep,wrad, window measured along its -A2,0,15, perimeter. The outline is easy -A2,B,15, to write. End with a -1. A2,B,15, A2,0,15, – The masking values for the -A2,0,-1, bPRISM_ are all 15 because -A2+fwid,fwid,15, you want lines at all the -A2+fwid,B-fwid,15, corners. A2-fwid,B-fwid,15, A2-fwid,fwid,15, – The Inline is the same as the -A2+fwid,fwid,-1 Outline, just adding or

subtracting ‘fdep’.

!Sill bPRISM_ fmat,fmat,fmat, – Sill Outline is a copy and paste of the frame Outline, just 5, sdep,wrad, change ‘B’ to ‘sthk’. -A2,0,15, – Give the frame a negative -A2,sthk,15, thickness and give the sill a A2,sthk,15, A2,0,15, positive thickness. -A2,0,-1 – The XY pointlist for the Glass

is a copy and paste of the

!Glass frame Inline. ADDz -fdep/2 bPRISM_ gmat,gmat,gmat, 5,-0.01,wrad-fdep/2, - Although we wish to raise the glass, we are currently in a -A2+fwid,fwid,15, mirrored state thanks to the -A2+fwid,B-fwid,15, MULz -1. Therefore we must A2-fwid,B-fwid,15, lower the glass in order to A2-fwid,fwid,15, -A2+fwid,fwid,-1 elevate it. DEL 3 !2D Script ROT2 180 PROJECT2 4,90,1 DEL 1

– Return the cursor to the origin. – We must view the frame from the direction it would seen if it was in the plan. That is side view at 90˚, with the camera rotated.

©Copyright Marmalade 1998, 1999, 2000, 2001

The first effort corrected with four tricks.

The sill script is easily done. This has a common surface with the outside edge of the window frame, so by making the thickness positive, and the window frame negative, the window frame grows upwards, and the sill grows downwards. The Glass is more difficult. You can see from the 2D script and from the 2D image (previous page) that the glass doesnt quite meet the frame correctly. In 3D, it is sunk into the frame. Some extra trig and analysis would be required to get this to fit exactly. For simplicity, the glass is raised to be half the depth of the window frame.

2D Script This follows the guidelines in previous windows in the GDL Cookbook. The pen colour can be set from the user settings box. The symbol is best left as a wireframe so that the frame can be seen. This would be most difficult to write in native 2D GDL, but if you are familiar with Polylines that would help. The example in the GDL manual is written as if the window is viewed from above, so it would have to look as difficult as that example.

Observations – some IFs If you change the radius of the wall, the windows in it take some while to realise that the radius has changed. They remain at the previous radius. You may even have to close the file and re-open it. Even a rebuild fails to tell the window of the change. If you change the window so that it is set within the reveal instead of flush with the wall, it seems to cope remarkably well. If you wish for details such as opening casements which show accurately in plan and in 3D, you will need some formidable trigonometry to resolve it perfectly. 2.115

The GDL Cookbook 3 – Voyager

More mysteries to uncover If you wish to have straight reveals – as opposed to ones that are perpendicular to the tangent of the wall – you have a real problem. You can insert the WALLHOLE command at the start of the 3D Script, as above. You will get reveals that are in the plane of the centre line of the window. These only work in the 3D window. The plan above is the view in the floor plan, the plan below is the plan in the 3D view. Although we use a Project2 in the 2D Script, this does not inform the floorplan manager of the change of profile in the reveal. The manual confirms that you cannot get this to change the floorplan view. You can only do this by cutting a larger hole and then back filling the window jambs with wedge shaped side pieces which use global variables to work out the properties of the wall. This would need another article.

Spraying Mullions If you wish to distribute mullions or small glazing bars in a curved window, you must get them to follow the curve of the frame, so they cannot simply be placed with ADD commands. One way is to ‘spray’ them from the centre of curvature. Let’s try an example. First you need to calculate some additional internal parameters. If you are doing a complex object, prototype these in the 3D script and then move them to a permanent place in the Master script along with the ones we wrote earlier. Add one new parameter for number of panes, which I have called ‘npan’. • You need the width of the opening, as measured along the perimeter of the window frame. • From this, you derive the angular width – it’s done by reciprocating the old formula – perimeter=2piR. The window width is a proportion of the perimeter, so the angle must be the same proportion of 360˚. • Finally, you need to know the angular separation of the glazing bars centres – divide by the no. of panes. The spray loop: In the routine, use a FOR... NEXT loop based on angle. For each iteration, you start from the origin, bounce up to the centre of the circle, rotate around Y – not to the edge of the frame but to the location of the first glazing bar. You then descend to the window, draw the bar and retreat back to the origin, using DEL. It continues to spray glazing bars until it reaches the end, but you do not want one at the end frame. So reduce the final angle by one degree to make sure it stops before the frame. (For this, we made an arbitrary assumption that glazing bars are 1/3 of the width of the main frame.)

Better 2D Symbol for Glass If you move those calculations to the Master Script, you can get more accurate glass in the 2D. The routine has to know the value of ‘angpan’ by this time. If you use 2piR again, you can work out the actual width of the glass at the midpoint of the frame, and replace the previous BPRISM for the glass with this routine. 2.116

You want parallel reveals? An incorrect Reveal shape is shown in floorplan, even though the WALLHOLE is active.

!Insert into 3D Script WALLHOLE 5,0, -A/2,0,15, -A/2,B,15, A/2,B,15, A/2,0,15, -A/2,0,-1

Correct Parallel Reveal shape as shown in 3D Wireline: but you would need to rethink the jambs and the window frame section itself.

!Add vertical Glazing bars glaswd=(A2-fwid)*2 !Width of Glass along perimeter angpan=glaswd*360/(2*PI*wrad) !Angular width of Glass panang=angpan/npan !Angular width of each pane MATERIAL fmat FOR an=-angpan/2+panang TO angpan/2-1 STEP panang ADDz r1 !Use r1, not R_ ROTy an !the loop counter is an angle ADDz -wrad+fdep/3 PRISM 5,fdep/3, !One glazing bar -fwid/6,fwid, This will NOT work correctly in -fwid/6,B-fwid, GDL, as R_ has a value of zero, so fwid/6,B-fwid, fwid/6,fwid, you should use the value ‘r1’ which -fwid/6,fwid was derived earlier and has a token DEL 3 value of 1 metre when in GDL. The NEXT an window only works correctly when

the window is placed in a wall.

!Actual Glass width glass_wid=2*PI*(wrad-fdep/2)*angpan/360 !Glass bPRISM_ gmat,gmat,gmat, 5,-0.01,wrad-fdep/2, -glass_wid/2,fwid,15, -glass_wid/2,B-fwid,15, glass_wid/2,B-fwid,15, glass_wid/2,fwid,15, -glass_wid/2,fwid,-1

This only works if the routine already knows ‘angpan’. So move the glazing bar parameter calculations to the Master script, along with the other calculations. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Stretchy Edging Tool T

HIS OBJECT is almost like a macro – in the sense that the routine is standardised, and can be used over an over again. All you have to do is put a different profile into the PRISM statement, and whatever you define will become a stretchy cornice/ skirting/ eaves piece/ metal flashing/ cladding panel, or whatever it is intended to be. The mitring routine allows it to follows a wall or roof edge, however angular (except curved). In terms of GDL, it is interesting in that it uses: • Polylines in the Prism shape • CUTPLANE and CUTEND • PUT and GET as a way of making a PRISM • Trigonometry in 2D scripting

3D Script The mitring could be for an internal or an external corner. To make sure that there is always substance to the Prism, you must make the PRISM its full length, plus at least twice its depth at each end. Use CUTPLANE to make it the correct length – even when there is no mitre. This will allow pretty extreme angles to be chosen by the user.

2D Script In most things, 2D scripting is useful, but for stretchy objects, good 2D scripting is vital. Some trig is required to make the hotspots land on the corners, however extreme the mitring angle. Unless there are many of these items, it is acceptable to use PROJECT2 in the 2D script, which saves one some hard work with trigonometry. However, if you need trig to work out the hotspots, you could just as well script the entire 2D object.

!External coving !2D Script HOTSPOT2 0,0 HOTSPOT2 A,0 HOTSPOT2 0,-bpro HOTSPOT2 A,-bpro HOTSPOT2 A/2,0 HOTSPOT2 A/2,-bpro HOTSPOT2 -bpro*TAN(mitr1),-bpro HOTSPOT2 A+bpro*TAN(mitr2),-bpro IF mitr1<>0 OR mitr2<>0 THEN PROJECT2 3,270,2 ELSE RECT2 0,0,A,-bpro ENDIF LINE2 -bpro*TAN(mitr1),-bpro, A+bpro*TAN(mitr2),-bpro

©Copyright Marmalade 1998, 1999, 2000, 2001

It may be difficult for the user to know which is the start and the end, and whether mitres should be positive or negative angles – but they soon find out by trial and error. The Section Depth and Projection give you an opportunity to build into the PRISM definition as much parametric control as you want. !External coving !3D Script MATERIAL emat Material command must always PEN pcol come BEFORE Cutplane! RESOL 16 50:!Organise cutplanes ROTy -90 People who find this doesn’t work have ROTx -mitr1 CUTPLANE usually forgotten to DEL after issuing the DEL 2 Cutplane commands. ADDx A ROTy 90 ROTx -mitr2 CUTPLANE DEL 3 100:!Make the Prism ROTy -90 ADDz -A-bpro*2 !Put values for !main Cornice panel PUT 0,0,15, -0.030,-bpro, 15, -0.070,-bpro, 15, -0.070,-0.160,15, -0.075,-0.160,13, This is how to draw the PRISM -0.120,-0.110,1013,outline – in the NEGATIVE -0.125,-0.100,13, quadrant of the X-Y plane. -0.165,-0.066,1015, -0.170,-0.065,15, -0.170,-0.050,15, -0.230,-0.050,15, -0.230,-0.030,15, This could be adapted -sdep, -0.030,15, into a ‘universal coving -sdep, -0.000,15, tool’ if you have a folder 0, 0, -1 full of PRISM-based !Now Do it! PRISM_ NSP/3,A+bpro*4, coving profiles stored GET(NSP) as macros, and just put DEL 2 a CALL statement in !Finish here instead of the CUTEND CUTEND PRISM statement END:!-----------------


The GDL Cookbook 3 – Voyager

Boundary Survey Tool T

HIS is a ‘survey assistant’ – you can set up a theodolite on a tripod on a site in one place, measure distances to all corners and some points on the site, note their angle (azimuth) from the instrument. Write these with a text editor and you can produce a topographically accurate site model. It is an interesting example of: • File input – reading in from a data text file • Using Arrays • Define Style and Autosizing forms • Using the PUT and GET functions • Loops where only REPEAT... UNTIL will do

Survey Textfile


he user types in the name of the project, followed by a list of the points (in order) of the boundary using Angle, Distance, Altitude and a flag of 0 for boundary. This is followed by internal points, which are written the same, with a flag of 1. The file is saved into ‘ArchiCAD Data folder’.

Master Script Does the whole reading operation and puts the coordinates and levels into an array. The flags f[…] tell it if it’s part of the boundary or internal. This example is limited to 20 points. OPEN and INPUT are some of the most difficult of commands to understand – by writing a statement that somehow determines the value of a useless number (‘n’), you discover the value of variables and strings. Read the appendix to the manual on this function, and try this (‘n’ is the number of items found). ‘n’ is -1 when the file end is reached. To make practical use of ARRAYS you must be prepared to use the PUT and GET statements to build and use the arrays. Derivation of the x[…] and y[…] values is a piece of Circle geometry – the X and Y of every point defined by radius and azimuth is found with a SIN and COS statement. With AC 6.X, we can use this routine to make a MASS command. This forms the site with correct levels.

3D Script The MASS command is a delight to use, but you need to learn it. The first points are the boundary points, with a masking code of 15, ending in a -1 (like Prisms). The internal points are all separately listed, ending in -1. 2.118

Arrays have to be ‘declared’ first – here the array is declared with the DIM command, and must not exceed 20 numbers. You could increase this number. !Boundary Survey Tool !Master Script DIM angl[20], dist[20], alti[20], x[20], y[20], z[20], f[20] !titlestr will be title ch1=OPEN("TEXT",fnam,"SEPARATOR=',',MODE=RO") n=INPUT(ch1,1,1,titlestr) !title !REPEAT Loop – necessary because !FOR NEXT loop cannot be used with INPUT REPEAT !Fill the array p=p+1 n=INPUT(ch1,1+p,1,ang,dis,alt,flg) angl[p]=ang: dist[p]=dis alti[p]=alt: f[p]=flg UNTIL n<=0 CLOSE ch1 pall=p-1 !Number of all Points FOR k=1 TO pall x[k]=SIN(angl[k])*dist[k] y[k]=COS(angl[k])*dist[k] NEXT k p=0 !Find how many external & intenal REPEAT p=p+1 UNTIL f[p]<>0 OR p>=20 pext=p-1 !No of External points pint=pall-pext !No of Internal points

When you open a file, you have to define the channel (‘ch1’), and the characteristics (mode, separator etc) that GDL will expect to find. !Survey Tool – 3D Script PEN L_ !uses variables MATERIAL M_ !in settings box !Draw the Site FOR k=1 TO pext-1 !External PUT x[k],y[k],alti[k],15 NEXT k PUT x[1],y[1],alti[1],-1 FOR k=pext+1 TO pall !Internal PUT x[k],y[k],alti[k],-1 NEXT k BODY -1 MASS M_,M_,M_, pext,pint,16+64*slin,0, GET(NSP) BODY -1

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager !Survey Tool – 2D Script PEN L_ DEFINE STYLE "boundy" ft, fh,1,1 SET STYLE "boundy" !Draw the Site PROJECT2 3,270,1 FOR k=1 TO pall HOTSPOT2 x[k],y[k] CIRCLE2 x[k],y[k],A_*fh/2000 IF shol THEN altstr=STR(alti[k],4,2) TEXT2 x[k],y[k],altstr ENDIF NEXT k

2D script

Survey Textfile

Text always has to be defined. The site is drawn with PROJECT2, but the hotspots and details are added using the array. The circles are autosized to be the same height as Font, taking note of the drawing scale A_.

You type in the survey details in any text editor, save it as an ascii (text) file and put it into the ‘ArchiCAD Data Folder’. Put a title on the first line. Write in the order: Azimuth, Distance, Altitude, Flag. Use commas to separate numbers. Boundary points come first with a ‘0’ flag, then interior points follow using the ‘1’ flag

Site survey 10, 12.65, 2.7,0, 30, 10.55, 2.0,0, 80, 21.55, 2.3,0, 128, 10.55, 2.2,0, 196, 14.55, 1.9,0, 210, 9.50, 1.7,0, 245, 10.55, 2.5,0, 285, 8.55, 2.0,0, 325, 6.55, 2.6,0, 360, 6.75, 2.1,0, 0, 0, 3.6, 1, 270, 2.35, 3.6,1,

Storey Sensitivity Global variables, 2D Scripting, DEFINE • Global Variables, Define Line


FTEN an object needs to appear on other storeys1, such as main beam lines, ventilation ducts, drainage lines, lighting fittings etc. Here is an example of Storey Sensitivity, using a simple stretchy round table. On its own storey, the Global variable S~ (also known as GLOB_CH_STORY_DIST) is zero. On other storeys it’s a number e.g. 1 for the storey above, -1 for the storey below. So it can be displayed on the home storey in all its glorious detail, and on other storeys it will show more simply using a linetype of the user’s choosing. One thing you can introduce here is a ‘Calculated Line type’. This could be based on a fraction of the circumference of the table, in this case 1/36 of it – gives you a consistent line quality regardless of the drawing scale (means the dotted line pattern will be the same at 1/50 or 1/200 scale). DEFINE LINE_TYPE is a nightmare, but the example here works. AC never draws a dotted arc or circle correctly, your line ‘bounces’ back on itself just before it closes the circle. !Simple Table !3D Script RESOL 12 MATERIAL 'Whitewash' PEN 1 FOR k=1 TO 4 ROTz k*90 ADDx A/2-thk CYLIND hit-thk,thk/2 DEL 2 NEXT k RESOL 24 ADDz hit-thk CYLIND thk,A/2 DEL 1

1 In UK spelling, ‘stories’ (pl. from story) are what you tell your children at bedtime, and ‘storeys’ are what you call levels in buildings. ©Copyright Marmalade 1998, 1999, 2000, 2001

!Simple Object to demonstrate !Storey sensitivity HOTSPOT2 0,0 HOTSPOT2 -A/2,0 HOTSPOT2 A/2,0 LINE_TYPE HOTSPOT2 0,-A/2 sizes are like HOTSPOT2 0, A/2 Font height in DEFINE LINE_TYPE 'solid' 1,1,1 defining style. SET LINE_TYPE 'solid' The dimensions IF S~=0 THEN !Legs in the DEFINE FOR k=1 TO 4 statement are ROT2 k*90 the actual CIRCLE2 A/2-thk,0,thk/2 segment length DEL 1 as drawn by NEXT k ENDIF your plotter, nothing to do IF S~<>0 THEN with the IF calclin THEN circum=PI*A !Circumference dimensions of DEFINE LINE_TYPE 'tabl_lin' 1/A_,the objects they 2, circum/36,circum/36 are drawing. SET LINE_TYPE ‘tabl_lin’ This routine ELSE will guarantee SET LINE_TYPE lint that the ENDIF segments are ENDIF resized to fit CIRCLE2 0,0,A/2 !Tabletop

your object.

This dotted circle has 36 segments and gaps, but at the end point, you always get a double segment

Special line types do not work unless ‘Use Object’s own Line Types’ is ticked


The GDL Cookbook 3 – Voyager

TEXT and DATA GDL Add-ons How to create, read, or write onto a .TXT file from inside GDL. by Laurent Godel (‘gdlguru’) Introduction


HE TEXT and DATA GDL add-ons provide devel opers and users of GDL library parts the ability to store and retrieve data (parameters, values, text strings) inside or from text files. These text files are independent from ArchiCAD Project files, and can be imported into or exported from any software with text processing capabilities (word processors, spreadsheets, databases....). This text tries to unveil the little secrets behind these add-ons, how they work, when they do not, and to provide the readers with some basic skills to start using the outstanding possibilities they offer. This is no replacement for the official documentation issued from Graphisoft, it is rather meant to be a complement. Before starting the following exercises make sure you have access to the ReadMe files in html format, to be found inside the Add-ons folder inside your main ArchiCAD folder. The basic syntax of the different commands is there and will not be explained here. Also check the GDL Reference Guide’s appendix on the TEXT add-on.

Possible uses Okay, but what is it for? On one side, these GDL addons can be used to exchange data or parameters from other software into ArchiCAD, via library parts. For example, you can build a list of commonly used annotations to your drawings, and have a Label object retrieve the annotations just by typing their reference

Startup: Creating a blank Text file from inside GDL The OPEN & CLOSE commands The TEXT and DATA GDL add-ons work with channels, that is, each text file to be worked with is a different channel. Channels are defined by the file name, the opening mode (read-only, write-only, amend), and the definition of a separator between fields. Both add-ons operate on the same type of document, the simplest text files, that can actually be opened by almost any existing software. The difference between the two add-ons relies in how they read/write inside the files. The simplest task these add-ons can achieve is the creation of text files. Upon running through the following lines of code, ArchiCAD's GDL compiler will create the corresponding text files, identified by the _filename parameters. Using the following commands will create empty text files. Read ahead on how to fill 2.120

Laurent Godel is part of the GDLA and the ArchiCAD University team. This ‘mega’ contribution is part of the process of widening the GDL Cookbook to be the primary compendium of GDL education. code, instead of having to type the same note repeatedly. Another application of these is the ability to create lists automatically; an object that is repeated many times across a project (a piece of furniture, for example) can automatically store its measures, and this automatically generated list can be opened, processed or printed at any time, without the need for a list calculation, to control the number of this particular furniture piece inside the project.

the files with the desired contents. In the meantime, try pasting this at the beginning of the 2D script of a new library part. !********* FILE CREATION- "TEXT" Tfilename="TEXTfile.txt" ch1=OPEN("TEXT",Tfilename,"MODE=WA") CLOSE ch1 !********* FILE CREATION- "DATA" Dfilename="DATAfile.txt" ch2=OPEN("DATA",Dfilename,"MODE=WA") CLOSE ch2 !********* SYMBOL LINE2 0,0,a,0

Notes: a) Using "MODE=WO" (write only) instead of WA (write after) will in this case have the same effect, the creation of the two text files identified by their names. If the file already exists and WO is used, the file will be cleared of its contents. Using WA the contents of the file will not be affected, it will only be created if it does not exist. b) The CLOSE command is important; always remember to CLOSE any channel after opening/using it. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Default Locations – TEXT & DATA After pasting the above lines of GDL code, take a look at the 2D Full view of the object. A line should be drawn horizontally. Having done this, minimize ArchiCAD (Choose Hide ArchiCAD from the application menu in Macintosh), and open your current ArchiCAD folder. The two corresponding text files can be found, one directly inside the ArchiCAD folder (default destination for the DATA add-on), and the other inside a subfolder called ArchiCAD Data Folder (default for the TEXT add-on). These are the default location of txt files processed by the add-ons. In the difference between both locations lies one of the key differences between the TEXT and DATA add-ons. In the same way these add-ons default the creation of txt files to these locations, when trying to read files they will look into these directories. If they do not find the desired files and are not instructed to look elsewhere, an error message will be displayed and all GDL interpretations will be aborted. The DIALOG option allows you to interactively point these add-ons to a file on a location other than default. Read ahead.

DIALOG Option for User Defined Location

FULLPATH Option for Fixed Custom Location

Adding DIALOG to the opening mode inside the OPEN command will enable you to define a location other than the default one. At this time, though, the CREATION of text files through the DIALOG option is only available using the DATA extension:

Adding the FULLPATH keyword instead of DIALOG inside the OPEN command, the add-on will interpret the file name as a path to an existing directory, making it possible to use files with a fixed position inside a server for example. The path syntax is different depending on your system.

!********* FILE CREATION- "DATA" Dfilename="DATAfile.txt" ch2=OPEN("DATA",Dfilename,"MODE=WA, DIALOG") CLOSE ch2 !********* SYMBOL LINE2 0,0,a,0

Upon reconstructing the 2D full view of the library part ArchiCAD will display a dialog with buttons allowing the user to SEARCH for the file or CREATE it inside the desired directory/folder. Trying this method with the TEXT add-on, a dialog will also appear, but with one single button, allowing you only to select an existing file. Thus the file cannot be created directly in a custom position using the TEXT add-on. Try it: !********* FILE CREATION- "TEXT" Tfilename="TEXTfile.txt" ch1=OPEN("TEXT",Tfilename,"MODE=WA, DIALOG") CLOSE ch1

When reading files, the DIALOG keyword will work fine both with TEXT and DATA add-ons. It just will not allow you to create a new file with the TEXT add-on, in a different location than the default one (ArchiCAD Data Folder).

©Copyright Marmalade 1998, 1999, 2000, 2001

On Macintosh: !********* FILE CREATION- "TEXT, FULLPATH, MAC" Tfilename="server:projects folder:TEXTfile.txt" ch1=OPEN("TEXT",Tfilename,"MODE=WA, FULLPATH") CLOSE ch1 !********* FILE CREATION- "DATA, FULLPATH, MAC" Dfilename="server:projects folder:DATAfile.txt" ch2=OPEN("DATA",Dfilename,"MODE=WA, FULLPATH") CLOSE ch2

On Windows: !********* FILE CREATION- "TEXT, FULLPATH, WINDOWS" Tfilename="E:\projects folder\Tfile.txt" ch1=OPEN("TEXT",Tfilename,"MODE=WA, FULLPATH") CLOSE ch1 !********* FILE CREATION- "DATA, FULLPATH, WINDOWS" Dfilename="E:\projects folder\DATAfile.txt" ch2=OPEN("DATA",Dfilename,"MODE=WA, FULLPATH") CLOSE ch2

If any connected drive is designed by "E:" or has the name or "server", and a folder called "projects folder" can be found at root level, the files will be created. Otherwise ArchiCAD will give you an error message. It is important, then, that the path to the file be established very precisely.


The GDL Cookbook 3 – Voyager

Reading inside a File Creating a sample text file How these add-ons read into .txt files is easy to understand and to implement inside a GDL object. Writing to a file is a somehow more complex operation and will be examined further on. Using WordPad or DeskEdit in Windows or SimpleText on Mac create a text file with the following contents, simulating a sheet list for a small project: A01 A02 A03 A04 A05

Ground Floor First Floor Roofs Section A Section B

1:50 1:50 1:50 1:20 1:20

Use TABS to separate values on the same line. This file will be interpreted as a database, that is, each line or row will be considered as a RECORD, and each value between TABS will be considered a FIELD. Tabulators are the standard field separators used by the GDL add-ons. They are also the separators other software like Excel or FileMaker use when they export spreadsheets or databases to text format. However, the GDL add-ons can be instructed to look for other characters (such as commas) as field separators, but here we will stick to the standard. Save the file as SHEETS.TXT anywhere on your drives. If you are using any other software than those mentioned above make sure you export or save as tabseparated text (like if you are exporting from Excel).

Importing all contents of the file (TEXT add-on)

Explanation: Each INPUT line reads inside the row defined by the linecont parameter, starting on the first column (first value), a series of three values identified by parameter names sheetnum, sheetname and sheetscale. After processing the input line, the nr parameter holds the number of read parameters, usually 3, but -1 in the case of the end of the file. So using the WHILE/ ENDWHILE routine we instruct the part to load as many rows as it can find inside the text file. Try adding rows to the text file, save it overriding the original one, and reconstruct the 2D symbol of your Library part. It will automatically display all the existing rows. So why not try this technique on the number of columns? Why take the trouble to write three parameter names, when in theory we could be using a WHILE/ ENDWHILE routine to read all the existing fields inside a record (or row)?. Try this: !********* DISPLAY ALL CONTENTS ch=OPEN("TEXT",”SHEETS.TXT”,"MODE=RO, DIALOG") linecont=1 fieldcont=1 nr=INPUT(ch,linecont,fieldcont,value) WHILE nr>-1 DO WHILE nr>0 DO text2 fieldcont,0,value fieldcont=fieldcont+1 nr=INPUT(ch,linecont,fieldcont,value) ENDWHILE add2 0, -6*A_/1000 linecont=Linecont+1 fieldcont=1 nr=INPUT(ch,linecont,fieldcont,value) ENDWHILE CLOSE ch

The following GDL lines, pasted inside a 2D script of a library part, will produce a 2D symbol displaying the totality of the SHEETS.TXT file, using the TEXT addon. !********* DISPLAY ALL CONTENTS ch=OPEN("TEXT",”SHEETS.TXT”,"MODE=RO, DIALOG") linecont=1 nr=INPUT(ch,linecont,1,sheetnum, sheetname, sheetscale) WHILE nr>-1 DO text2 0,0,sheetnum text2 1,0,sheetname text2 2,0,sheetscale add2 0, -6*A_/1000 linecont=linecont+1 nr=INPUT(ch,linecont,1,sheetnum, sheetname, sheetscale) ENDWHILE CLOSE ch

Note: If your 2D symbol does not display correctly set the drawing scale to 1:20.

This method works for all but the last record of the text file. Unexpectedly, the nr parameter receives -1 (end of file) two fields earlier than should be. So this method is uneffective; you can get an object to import all the rows of a text file no matter how large it is, however you must have an idea of how many columns there are, for automatic cumulative column input does not work. Our first method can be made better by first importing all the file’s contents inside a parameter array, then displaying it. This is structured programming, useful for debugging and handy if you need to process data after reading it: !********* IMPORT ALL CONTENTS ! INTO ARRAY DIM tab[50][3] !maximum 50 rows per 3 columns ch=OPEN("TEXT",”SHEETS.TXT”,"MODE=RO, DIALOG") linecont=1


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager nr=INPUT(ch,linecont,1,val1, val2, val3) WHILE nr>-1 AND linecont<49 DO tab[linecont][1]=val1 tab[linecont][2]=val2 tab[linecont][3]=val3 linecont=Linecont+1 nr=INPUT(ch,linecont,1,val1, val2, val3) ENDWHILE CLOSE ch linecont=linecont-1 !********* DISPLAY ALL CONTENTS FOR cntline=1 TO linecont text2 0,0,tab[cntline][1] text2 1,0,tab[cntline][2] text2 2,0,tab[cntline][3] add2 0,-6*A_/1000 Next cntline

The only drawback of this is that the maximum number of rows to be inputted is limited by the dimension of the tab parameter array. We will then have to make sure we give this array a sufficient number of rows.

Writing inside Text Files This might be the most interesting feature of these addons. The OUTPUT command allows a GDL script to store inside a specified text file any value of any kind, text or number.

Writing with the TEXT add-on Again, the TEXT and DATA add-ons will behave differently while doing output commands. We will start with the simplest, the TEXT add-on. Open a fresh new library part (object), and inside the 2D Script of the part paste the following lines: !********* REQUEST CURRENT TIME dstr = "" ch = OPEN ("DateTime", "", "%m/%d/%Y, %X") n = INPUT (ch, "", "", dstr) CLOSE (ch) text2 0,0,dstr

Reading Only One Record (DATA add-on)

!********* REQUEST CURRENT PROJECT FILE NAME name="" nomplan=REQUEST("Name_of_plan","",name)

To the opposite of the TEXT GDL add-on, the DATA add-on is aimed at browsing a file’s content searching for a specific field. The syntax is similar to the one used in the previous exercise, but the results are different:

!********* OUTPUT TO LOG FILE chOUT=OPEN("TEXT","filelog.TXT","MODE=WA") OUTPUT chOUT,1,1,name,dstr CLOSE chOUT

!********* RECORD SEARCH (DATA ADD-ON) ch=OPEN("DATA",”SHEETS.TXT”,"MODE=RO, DIALOG") searchfield="A03" nr=INPUT(ch,searchfield,1, sheetname, sheetscale) text2 0,0,searchfield text2 1,0,sheetname text2 2,0,sheetscale CLOSE ch

In this case the add-on internally reads all the file’s

contents and gives back the found values for sheetname and sheetscale based on the searchfield parameter. This is useful if you want your titleblock to read the sheet definition parameters automatically from a predefined sheet list. Just make the searchfield parameter accessible from the Object Settings dialog box, allowing the user to search for any key value, and the script will do the rest.

Save this object as “filelog.GSM” and insert it on your floor plan. The 2D symbol should display the date and time as set inside your computer’s system settings. Please note that the time displayed inside the 2D symbol of the filelog object does NOT change when you choose the Display/Rebuild command on your floor plan. It does though when you press ALT and choose this last command, that is then called Rebuild & Regenerate. In the same way, the output command will only be effective when you rebuild and regenerate your floor plan, or change its scale, or switch floors, or simply when you open your project file. By inserting the filelog library part on your floor plan the filelog.TXT file has been created by the TEXT archicad add-on inside the ArchiCAD Data Folder. To see its contents you can either build a little file-reading library part using the previous chapter of this document, or open the file using a simple text editor (Wordpad for Windows or SimpleText for Mac users).

Make the searchfield parameter accessible from the Object Settings dialog box ©Copyright Marmalade 1998, 1999, 2000, 2001

Now you can laugh at me for working so late... Apart from this, you should see that, for each rebuild & regenerate of an ArchiCAD project file with the filelog.GSM library part inserted on it, a line has been added to this text file, actually creating a 2.123

The GDL Cookbook 3 – Voyager

Tips and Tricks Beams are groovy!


rchiCAD 6.5’s Beamtool is notable for its cutting ability. To make the object here in the foreground, place some beams in your slab, save the result as an Object, open the Object, and delete the BEAMs from the 3D script. This works on Walls too. Beams generate a CUTPOLY command in the 3D script. It doesn’t work on Roofs, but it will if you open the Object, delete the BEAMs, and move the CUTEND commands to the end of the script. Amend the 2D script to a PROJECT2.

For each rebuild & regenerate of an ArchiCAD project file, a line has been added to this file, creating a log allowing you to control the time you spent on each project.

log allowing you to control the time you spent on each project. If you insert this part on your office templates, then you will be able to control exactly what file was opened, and when; just look into each computer’s ArchiCAD Data Folder for the filelog.TXT file. In the above script we used the Write After (WA) instruction upon opening the channel, thus. If we change this WA to WO (Write Only), at each time we rebuild & regenerate the floor plan, the contents of the text file will be erased and a single entry will be written, containing the current project file name, date and time.

Writing with the DATA add-on When writing into files the DATA add-on does basically the same as when it is reading values. It is instructed to search for a specific record; if it finds it inside the text file it just amends it with the desired values. If it does not find the specific record it will just create it. Let’s build a filelog similar to the one above but using the DATA extension. The pursued result is that, instead of blindly adding new lines to our text file, our filelog library part will just write one line for each ArchiCAD project file opened, storing the last modification date and time. !********* REQUEST CURRENT TIME dstr = "" ch = OPEN("DateTime", "", "%m/%d/%Y, %X") n = INPUT (ch, "", "", dstr) CLOSE (ch) TEXT2 0,0,dstr !********* REQUEST CURRENT PROJECT FILE NAME name="" nomplan=REQUEST("Name_of_plan","",name)


This would take a lot of thought to build in native GDL, and 60 secs to build by this method

!********* OUTPUT TO LOG FILE chOUT=OPEN("DATA","filelog.TXT","MODE=WA") searchfield=name !look for current project name OUTPUT chOUT,name,1,dstr CLOSE chOUT

This time open the filelog.TXT file located directly inside your current ArchiCAD folder, using WordPad or SimpleText or even Excel or FileMaker. The file has been placed here because this is the default location for files created using the DATA add-on. What you get is a tidy log file, with one record of data for each ArchiCAD project file that you open (as long as the library part containing the above script is inserted inside the project file). No matter how many times you rebuild & regenerate your floor plan, only one line will be displayed for each project. The data and time get updated each time you do.

What you get is a tidy log file, with one record of data for each ArchiCAD project file that you open

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Multiple outputs The filelog.gsm is a handy library part you can start using immediately that will store inside the text file some useful information about the ArchiCAD projects that you open during the day. For it to be effective you only need to place one instance of the object inside each project file, provided you set the part to be displayed on all stories and it is placed on the ArchiCAD Layer (always visible). Another application of storing parameters inside a text file is the automatic management of simple object schedules without having to calculate lists using ArchiCAD’s calculate menu. We will now build a simple rectangular symbol that will store its position and measures inside a text file. The most important issue here is how to control that each instance of our library part stores only one record of its position and measures. Using the TEXT add-on this seems impossible, meanwhile the DATA add-on will certainly do the job. But first we have to find one single and unique identifier for each instance of the library part, so as to direct the DATA add-on to the correct record and avoid duplicate entries inside our parameter text file. The ideal identifier is called Global Internal ID, GLOB_INTID is the name of this global parameter. This identifier is one single and unique number internally assigned to every construction element inside the ArchiCAD project. It is actually the entry number of the element inside ArchiCAD’s internal database. The following 2D script accomplishes the drawing of a rectangle using the A and B dimensions, and the storage of each instance of this object’s parameters inside a text file called ‘rectpar.TXT’ that will be created inside your current ArchiCAD folder. !********* 2D SCRIPT searchfield="#"+STR(GLOB_INTID,1,0) !internal unique identifier !********* Draw rectangle RECT2 -a/2, -b/2, a/2, b/2 HOTSPOT2 0,0 HOTSPOT2 -a/2,b/2 HOTSPOT2 a/2,b/2 HOTSPOT2 -a/2,-b/2 HOTSPOT2 a/2,-b/2 TEXT2 -a/2,b/2,GLOB_INTID !displays internal unique identifier !********* OUTPUT TO LOG FILE IF GLOB_CONTEXT = 2 THEN chOUT=OPEN("DATA","rectpar.TXT","MODE=WA") OUTPUT chOUT,searchfield,1,SYMB_POS_X, SYMB_POS_Y,A,B CLOSE chOUT ENDIF

Save this library part as SpecialRect.GSM inside your active libraries and insert a few instances of it on your floor plan, using different positions and measures (the numbers displayed may vary but should be unique):

©Copyright Marmalade 1998, 1999, 2000, 2001

Minimize ArchiCAD and take a look at the rectpar.TXT file that was created inside your current ArchiCAD folder :

Back into ArchiCAD, change the measures of some of the rectangles, then check the text file again and see how the values were updated. Note: Using a combination of any text type parameter ‘# in this case’ and the STR result of the GLOB_INTID parameter is safer than just using the identifier as a number. For some strange reason, the DATA add-on will sometimes write a new record even if the corresponding record exists, when only the GLOB_INTID is used as search field.

GSM file naming One of the new professional standards is that GDL object filenames should include an indication of the GDL version – 60 for 6.0 and 65 for 6.5. It should avoid confusion with generic objects and with older objects. So the WC featured in the article about DXF conversion might be saved as AS_WC_601_65.GSM, using underscore as separators. If you are still using 6.0 get into the habit of using 6.5 nomenclature (even on Macs). It will improve your library organisation in the long term.


The GDL Cookbook 3 – Voyager

Clearing the database So what is the use of this if simple ArchiCAD calculations give the same result without the need for GDL scripting? Well, in this case it is possible to create a little library part that will inform us ‘live’ of how many rectangles we have inserted on the floor plan. Inside a new library part, paste the following lines of text, a variant of what was established above of a reading GDL script: !******2D SCRIPT !****** INPUT NUMBER OF ROWS INSIDE TXT FILE ch=OPEN("TEXT",”rectpar.TXT”,"MODE=RO, DIALOG") linecont=1 nr=INPUT(ch,linecont,1,val1) WHILE nr>-1 DO linecont=Linecont+1 nr=INPUT(ch,linecont,1,val1) ENDWHILE CLOSE ch linecont=linecont-1 !****DISPLAY NUMBER OF ROWS INSIDE TEXT FILE string=STR(linecont,1,0)+” SPECIALRECT Objects Detected” TEXT2 0,0,string

Save this object as RectControl.GSM (upon saving ArchiCAD will ask you to locate the rectpar.TXT file, as we have instructed the TEXT add-on using the DIALOG keyword), and insert it on the floor plan, next to the previously inserted rectangles. Does it display the right number of rectangles?

So after deleting objects that use the DATA GDL addon, we need to clear the text file of its contents, then remaining instances of our parts can store their data again and the number of records can become accurate again. This can be done in two ways: Hide or minimize ArchiCAD, trash the rectpar.TXT file, go back into ArchiCAD and choose rebuild & regenerate. The number displayed by rectControl is accurate again. Another way, more orthodox GDL speaking, is to add a parameter to RectControl.GSM, called CLEARFILE, of type checkbox: Then paste inside the Parameter Script of RectControl the following lines, which upon activation of the CLEARFILE checkbox will open the file in Write Only mode, thus initializing it. After that the master script will turn the CLEARFILE checkbox Off again so the objects can safely store their parameters again. !*********MASTER SCRIPT !*********DATABASE CLEANING IF CLEARFILE THEN chCLEAR=OPEN("DATA",”rectpar.TXT”,"MODE=WO") CLOSE chCLEAR PARAMETERS CLEARFILE=0 ENDIF

The clearfile checkbox will then behave like a button. Save the RectControl part, and back on your floor plan delete a couple of more instances of SpecialRect. Then select RectControl, and activate the Erase File Contents checkbox. It will turn itself OFF automatically and immediately. Back on the floor plan, choose Rebuild & Regenerate. The number displayed by RectControl is now accurate.

Conclusion You now have the basic skills to build your own GDL and text interactions. Before developing a new application of these features do a little planning on how you need the parts to behave and interact between themselves. And keep in mind the golden rules:

Now drag a copy of one of the rectangles. Does RectControl display the right number of rectangles now? No, you need to rebuild & regenerate the floor plan for RectControl to update its data reading inside the text file again. When the SpecialRect was copied, the new instance did store its parameters inside the text file. However RectControl had no idea of what was going on and did not feel necessary to reload data from the text file. Remember to rebuild & regenerate your projects often when you use these GDL add-ons. In for another surprise? Select a couple of special rects and delete them from your floor plan. Does the RectControl library part display the right number now, even after rebuild and regenerate? It does not: In the current version of GDL (ArchiCAD 6.5 v3) there is no way to tell an object to delete its record when the object itself is cleared from the floor plan. Now that’s sad. 2.126

1) Use the DATA or TEXT add-on according to what each of them can do 2) When needed you must be able to clear the contents of a text file quickly, from within ArchiCAD. Instead of being a checkbox parameter inside an object the file cleaning feature can activate itself upon a certain circumstance inside ArchiCAD (for example, IF GLOB_SCALE=333 THEN....). Very useful and fast! 3) Over a network use the FULLPATH keyword and to define a complete path to the desired files on a server. This will ensure everybody on the team has access to the files. Avoid the DIALOG keyword in large groups. 4) When importing records, remember to transfer all data inside a parameter array, leaving the processing for after the input task. 5) As data interchange between GDL and TXT files can become slow when files are extensive or a lot of objects try to do it simulateously, it is good to provide the object with a “Store Parameters” checkbox, so actual export can be turned on/off any time.

©Laurent Godel, 2000 ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

TEXT & DATA GDL Add-ons Appendix – Variable type issues @ Laurent Godel, ‘gdlguru’


HE TEXT and DATA GDL add-ons will in some case make a confusion between value types when inputting values from a text file. This makes working with dates a difficult task. The following 2D script uses the TEXT add-on to write values to a tab-separated text file, then retrieves them using the same add-on, and displays the input values: !-----------test values string1="10/10/2000" !date string2="1/50" !scale string3=" 3*5+8" !formula !-----------OUTPUT COMMAND ch=OPEN("TEXT","test.txt","MODE=WO") OUTPUT ch,1,1,string1,string2,string3 CLOSE ch !-----------INPUT COMMAND inval1="?" inval2="?" inval3="?" ch=OPEN("TEXT","test.txt","MODE=RO") nr=INPUT (ch,1,1,inval1,inval2,inval3) CLOSE ch

10/2000”, returns a numerical value, 0.0005. Even though the “invalx” parameters were previously initialized as text. If we change the first string from “10/10/2000” to “10/10/00” something odd happens. The GDL add-on attempts to calculate the formula, which would result in an error since it is trying to divide by zero. Since there is an error inside the formula, the add-on decides to interpret the inval1 input value as a string. My advice is that when working with dates, scales, or generally text strings that could eventually result in mathematical formulas, it is safe to add a special character before the text when performing an output. OUTPUT ch, 1,1, ”#”+string1, ”#”+string2,”#”+string3

!-----------DISPLAY READ VALUES TEXT2 0,0, inval1 TEXT2 0,-6*A_/1000,inval2 TEXT2 0,-12*A_/1000,inval3

This way a following input script will ALWAYS recognize the values as text, and all you need is a little trimming in order to retrieve the initial string:

The results are surprising. Although we set up the initial output values as text strings, the input routine interprets the three of them as formulas, thus displaying their results. The date, “10/

nr=INPUT(ch,1,1,inval1,inval2,inval3) TEXT2 0,0,STRSUB(inval1,2, STRLEN(inval1)-1)

Unless the object you are trying to create is a GDL calculator....

Faithful old objects no longer so?

GDL Toolbox



VERY GDL writer has done this... open a old object, real ise it could be improved a lot, improve it. It works beautifully. It is superb. Congratulate yourself. Pat on the back. Return to the project plan and do a 3D and the object no longer draws or renders. Why? Well, the ArchiCAD project file keeps a database of the parameters of each object in the model. If you open a Library part into GDL, change or add parameter names, change the purpose of a parameter name from, say, Length to Material, introduce a Value list or anything significant and then resave... ArchiCAD will no longer know about these parameters, no matter how often you open and close the file or try to set parameter values. There is no alternative. Delete the object from the plan, and bring it straight in afresh from the Library. Perfect!

UST as we were going to press with the Cookbook 3, this was announced: the logical companion/alternative to ArchiForma. Try it for yourself. From: "Hinsenkamp, Tamas" <> GDL Toolbox is now available on both platforms! Download and try GDL Toolbox: Mac and Windows Demo versions for FREE. It is available in AddOnStore at GDL Toolbox now offers you new dimensions in professional interactive GDL modelling. You will also find there the GDL Toolbox Manual, Tutorial files, and project images for free download. GDL Toolbox is available in English, German Hungarian. For further product information subscribe to the add-onstore mailing list by sending a mail to with the subject SUBSCRIBE.

Modify EPS line weights >Daniel Vareika, Montevideo: Plotmaker can save ESP (Encapsulate Postscript) files well, but if you forget to set pen weights etc first, you cannot bring the EPS back to edit. However, there are many EPS editors:- e.g. Corel Draw, Adobe Illustrator, Macromedia Freehand. Open the file, don’t place or import, just open from the program. Then Select all (command A). Change thickness of all lines. Then you are ready to export it as EPS again. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Saving Parameter Sets By Laurent Godel

What are we trying to achieve?


RCHICAD library parts are outstanding because they are parametric: any object can be a small program, which calculates a results according to these defined variables: its parameters. However, when many parameters need to be set to define the result of a script, the task of setting and redefining each value can become a hard and time-consuming activity. Let’s see how a determined set of values for an object’s parameters can be saved by the user, and later retrieved without effort to re-establish the combination required for the desired result. We’ll build a simple object, called ‘2D Rectangular Tube’, where the 2D symbol will be governed by four parameters: Width(A), Height (B), Thickness, Fill type. We’ll see how to save sets like '5x3cm, aluminium fill' or '8x4cm, steel fill' and how to access these sets from a pulldown menu for quick retrieval of the defined combinations of width, height, thickness and fill.

Our first task inside the 2D script refers to the the creation of the desired POLY2_ shape: !--2D script-SET FILL fillt ADD2 -A/2,-B/2 POLY2_ 10,1+2, 0,0,1, A,0,1, A,B,1, 0,B,1, 0,0,-1, thick,thick,1, A-thick,thick,1, A-thick,B-thick,1, thick,B-thick,1, thick,thick,-1

How can this work? What we need is some kind of database to store the desired values along with the names of the combinations of values. For this purpose we will use a spreadsheet-like text file. We will need to provide the user with the possibility to STORE parameter sets inside the database, and to RESTORE parameter sets using their assigned names. This last feature will be addressed first, and it can be split into two sections: Data INPUT and PARAMETER SETTING.

Setting up a sample library part Create a new library part and its parameters names and types exactly as in the following illustration.

– A, B, Thickness and Fill type will be the parameters controlled by our ‘Save Parameter Sets’ feature. – The Avsets parameter will receive the pull-down list of available parameter sets. The two last parameters will allow the user to choose a name for a combination of settings and to actually store the combination inside the text file used as a database. We will make the ‘Record’ checkbox act like a button. 2.128

Check your scripting changing values for A, B, thickness and fill type to see if the 2D symbol responds correctly. If it does, save this object as 2D Rectangular Tube.GSM , inside your loaded, active library.

Setting up a sample parameter file Using Excel or a simple text processor we can set up a list of four combination of settings – the first column receives the name of the set, the second the width, the third the height value, the fourth the Thickness value, the fifth gets the Fill Type number.

Save the file using '2D Rectangular Tube_SETS.TXT' as filename, as TAB_SEPARATED TEXT, inside your current ArchiCAD Data Folder.

Data input from the parameter file Although the DATA GDL I/O Archicad Add-on allows for quick record search inside a text database, I recommend the use of the TEXT GDL I/O Add-on, for I have found the DATA extension to be unreliable in some cases, and find it safer to use the TEXT one. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Array definitions Through the TEXT extension, the first task for the library part will be to IMPORT saved settings to make them available to the users. We will input the whole contents of the database into two parameter ARRAYs which we have to declare at the beginning of the MASTER script. The first array will be a single-column one, called Avn (available set names). The second parameter array is called Inpt, the number of required columns is 4 (length, width, thickness, fill type). The reason behind inputting set names inside a different array than the assigned values is that we are going to use this array directly to define the values for the 'Available saved sets' pull-down list. In effect, GDL allows us to assign a complete array of values to a parameter by just typing the name of the array inside the VALUES command. We will provide the user a maximum of twenty saved sets to choose from, so the beginning of the MASTER script will bear these instructions: !---Array definitions and ! parameter types (MASTER SCRIPT) DIM Avn[20] DIM inpt[20][4] FOR i=1 TO 20 Avn[i]="....." NEXT i

Parameter type issues The initial definition of the values of Avn as ‘.....’ is required in order to provide the user with a readable pull-down menu for available saved sets, in the case that there are less than 20 saved sets. Through this we also initialize the Avn array as text type.

We end up with our Avn and Inpt arrays filled with as many parameters as there are inside the text file. The linecont parameter hosts the number of parameter sets successfully read.

Defining a value list for available parameter sets To assign the Avn array of parameters to the Avsets list of available sets we first need to make sure that both are the same parameter type, text in this case. So we have to run a small routine to convert all possible numerical Avn values to text. Paste this into your Master Script, just after the input routine: !--SET Avn TO TEXT TYPE FOR rep=1 TO linecont IF VARTYPE(Avn[rep])=1 THEN Avn[rep]=STR(Avn[rep],1,0) ENDIF NEXT rep

Now we will set the Avsets parameter we defined as text type at the beginning of this exercise to display the available saved sets names as they were read from the database file. Essentially, this means assigning the Avn array of values to the AvSets parameter, and adding a default value of 'NONE'. Paste this line inside the part's Parameter script: !--Assign Avn values to the Avsets parameter VALUES "Avsets" "NONE", Avn

Run a ‘check script’ to see if everything is OK, and check that the 'Restore available sets' parameter now shows a value list as in the illustration below:

Input script The following script lines input the contents of the text file inside our arrays. The first instruction actually creates the text file if it does not exist. In our case we have previously created the parameter file, but if you use this document to create new objects, it is safer to have it this way. !--CREATE THE PARAMETER FILE IF IT ! DOES NOT EXIST(MASTER SCRIPT) FILENAME="2D Rectangular tube_SETS.TXT" ch=OPEN("TEXT",filename,"MODE=WA") CLOSE ch !--INPUT DATA FROM TEXT FILE INTO ! ARRAY (MASTER SCRIPT) ch=OPEN("TEXT",filename,"MODE=RO") linecont=1 nr=INPUT(ch,linecont,1,val1,val2,val3,val4,val5) WHILE nr>0 DO Avn[linecont]=val1 inpt[linecont][1]=val2 inpt[linecont][2]=val3 inpt[linecont][3]=val4 inpt[linecont][4]=val5 linecont=linecont+1 nr=INPUT(ch,linecont,1,val1,val2,val3,val4,val5) ENDWHILE CLOSE CH linecont=linecont-1

©Copyright Marmalade 1998, 1999, 2000, 2001

Take a break and have a coffee.

Using the value list to restore parameter values Now we need the saved parameters to be restored when the user chooses a settings combination name from the pull-down list. We will instruct the parameter script to restore input values at the moment the Avsets parameter is changed. !--Restore values upon set selection IF GLOB_MODPAR_NAME="AvSets" THEN FOR rep=1 TO linecont IF Avn[rep]=Avsets THEN PARAMETERS A=inpt[rep][1], B=inpt[rep][2], thick=inpt[rep][3], fillt=inpt[rep][4] ENDIF NEXT rep ENDIF

Once this is done we need to set the Avsets parameter back to its default value. PARAMETERS Avsets="NONE"

Click on the parameters tab to the left of the Editor dialog, and check now that, when you choose a name from the ‘Restore available sets’ pull-down list, the 2.129

The GDL Cookbook 3 – Voyager

parameters’ values are automatically changed. Save. And have another sip of that cold coffee...What comes next is worse than this.

Adding settings to the parameter file Checking if a set name already exists The saving of a determined parameter set will depend on two things: First, if the set name already exists, we will have to warn the user that its values will be overwritten. To determine if the name exists, this routine is needed inside the Master Script: !--DETERMINE IF NAME FOR SAVED ! PARAMETERS ALREADY EXISTS FOR rep=1 TO linecont IF Avn[rep]=SetName THEN EXISTS=rep ENDIF NEXT rep

After the interpretation of these lines, if the set name already exists, the EXISTS parameter will be different than 0 and will contain the identifier of the row of our Avn array where its settings are to be found. With the next instructions we will determine the value of the currline parameter, which will be used as the row number to which our current settings will be exported. Paste this inside the MASTER script, following what we previously typed: !--DETERMINE ROW TO EXPORT ! CURRENT PARAMETERS IF EXISTS>0 THEN currline=EXISTS outcont=linecont ELSE IF linecont<20 THEN outcont=linecont+1 currline=linecont+1 PEN 4 ELSE outcont=linecont outnum=1 currline=1 ENDIF ENDIF

Two new parameters appear: outcont is the number of rows or parameter sets to export to the database file; outnum is needed when the number of saved sets is already 20 and we need to loose the last set of the list in order to export our current settings to the first line of the database file.

OUTPUT command All we need now is to paste the following script lines inside the 2D script of our part: !----EXPORT DATA TO FILE IF record AND GLOB_CONTEXT=5 THEN IF EXISTS<>0 THEN PRINT "Current set name already exists- It will be overwritten!!!" ch=OPEN("TEXT",filename,"MODE=WO") IF linecont=0 THEN OUTPUT ch,1,1,SetName, A, B, thick, fillt PRINT "Settings Added- please uncheck this box" ELSE FOR rep=1 TO outcont IF rep=currline THEN OUTPUT ch,1,1,SetName, A, B, thick, fillt PRINT "Settings Added/modified- please uncheck this box"


ELSE OUTPUT ch,1,1,Avn[rep-outnum], inpt[rep-outnum][1],inpt[rep-outnum][2], inpt[rep-outnum][3],inpt[rep-outnum][4] ENDIF NEXT rep ENDIF CLOSE CH ENDIF

These lines will perform output only upon activation the Record checkbox inside the object Settings Dialog Box. Note that there are two conditions: If linecont is 0, this means that no parameter sets were previously saved, then the output row is 1 (the first). In the other case, data export is performed using the previously defined outcont and currline parameters.

Where to put the parameter file? In this example, the 2D Rectangular tube_SETS.TXT parameters file is written and read directly from inside the ArchiCAD Data Folder, which is the default location for the TEXT GDL Add-on. This means that if your work group consists of many workstations connected to a server, each computer having its own ArchiCAD folder, every user will have access to the sets he or she saves, individually, unless you merge the contents of everybody’s parameter files regularly (that’s messy...). For every connected user to have access to one single and unique parameter file for saving and retrieving parameters sets, try defining the file name as a complete path. For example, on Mac: filename=”SERVER:PARAMETER FOLDER:2D Rectangular tube_SETS.TXT”

On Windows: filename=”E:/PARAMETER FOLDER/2D Rectangular tube_SETS.TXT”

This will work if you have previously created a folder named PARAMETER FOLDER on the root level of your server, and if your server is actually named “server” (mac) or “E:” (windows), and all the stations access it through the same name. GS recommends using the FULLPATH instruction inside channel opening instructions when the file name is actually a path: ch=OPEN("TEXT",filename,"MODE=RO, FULLPATH")

Please note that using the DIALOG keyword instead of FULLPATH, each user will be prompted to locate the file inside the server’s directories, therefore making it unnecessary to set up the filename parameter as a path. But this can lead to confusions, so stick to the path routine.

Further issues Our library part stores parameter sets inside a text file, which means ALL instances of the object have access to one single list of up to 20 sets of values. If you need EACH instance of an object to store and retrieve its custom parameter sets, then think about performing the same routines not on a text file but on a parameter array that can be used as a database. That ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Check your scripts Here you can find the complete Master, Parameter and 2D scripts for our library part. We have discussed the necessary steps to provide any library part with the ‘Save Settings’ function – just change parameter names in the INPUT and OUTPUT routines to meet the needs of your library your part.

Complete Master Script

Complete 2D Script

!---Array definitions and parameter types DIM Avn[20] DIM inpt[20][4]

!--EXPORT DATA TO FILE IF record AND GLOB_CONTEXT=5 THEN IF EXISTS<>0 THEN PRINT "Current set name already exists- It will be overwritten!!!" ch=OPEN("TEXT",filename,"MODE=WO") IF linecont=0 THEN OUTPUT ch,1,1,SetName, A, B, thick,fillt PRINT "Settings Added- please uncheck this box" ELSE FOR rep=1 TO outcont IF rep=currline THEN OUTPUT ch,1,1,SetName, A, B, thick,fillt PRINT "Settings Added/modified- please uncheck this box" ELSE OUTPUT ch,1,1,Avn[rep-outnum], inpt[rep-outnum][1],inpt[rep-outnum][2], inpt[rep-outnum][3],inpt[rep-outnum][4] ENDIF NEXT rep ENDIF CLOSE CH ENDIF !--2D script SET FILL fillt ADD2 -A/2,-B/2 POLY2_ 10,1+2, 0,0,1, A,0,1, A,B,1, 0,B,1, 0,0,-1, thick,thick,1, A-thick,thick,1, A-thick,B-thick,1, thick,B-thick,1, thick,thick,-1

FOR i=1 TO 20 Avn[i]="....." NEXT i FILENAME="2D Rectangular tube_SETS.TXT" !--CREATE THE PARAMETER FILE IF ! IT DOES NOT EXIST ch=OPEN("TEXT",filename,"MODE=WA") CLOSE ch !--INPUT DATA FROM TEXT FILE INTO ARRAY ch=OPEN("TEXT",filename,"MODE=RO") linecont=1 nr=INPUT(ch,linecont,1,val1,val2,val3,val4,val5) WHILE nr>0 DO Avn[linecont]=val1 inpt[linecont][1]=val2 inpt[linecont][2]=val3 inpt[linecont][3]=val4 inpt[linecont][4]=val5 linecont=linecont+1 nr=INPUT(ch,linecont,1,val1,val2,val3,val4,val5) ENDWHILE CLOSE CH linecont=linecont-1 !--SET Avn TO TEXT TYPE FOR rep=1 TO linecont IF VARTYPE(Avn[rep])=1 THEN Avn[rep]=STR(Avn[rep],1,0) ENDIF NEXT rep !--DETERMINE IF NAME FOR SAVED ! PARAMETERS ALREADY EXISTS FOR rep=1 TO linecont IF Avn[rep]=SetName THEN EXISTS=rep ENDIF NEXT rep !--DETERMINE ROW TO EXPORT ! CURRENT PARAMETERS IF EXISTS>0 THEN currline=EXISTS outcont=linecont ELSE IF linecont<20 THEN outcont=linecont+1 currline=linecont+1 PEN 4 ELSE outcont=linecont outnum=1 currline=1 ENDIF ENDIF

Complete Parameter Script VALUES "Avsets" "NONE", Avn IF GLOB_MODPAR_NAME="AvSets" THEN FOR rep=1 TO linecont IF Avn[rep]=Avsets THEN PARAMETERS A=inpt[rep][1] , B=inpt[rep][2], thick=inpt[rep][3], fillt=inpt[rep][4] ENDIF NEXT rep ENDIF PARAMETERS Avsets="NONE"

would mean doing all the work inside the parameter script. The parameter array has to be physically created inside the parameters tab of the Object Editor, not defined with a DIM command inside the Master script. It can be done! More coffee? ©Laurent Godel 2000 ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Custom Zone Stamp This little Zone object calculates the room’s capacity (of people) and checks the total width of doors for compliance with fire escape regulations. by Laurent Godel, ‘gdlguru’


OOKING into ArchiCAD’s built-in Zone Stamp’s scripts is a somewhat confusing experience. These objects are very complex. They read from various Global Variables [GV], sense different unit settings and create a data table within their symbol. In concept, Zone Stamps are 2D library parts linked to a colored polygon, which can be placed on the ArchiCAD floor plan using automatic boundary recognition. Zones Stamps are powerful in that they have access to features of constructive elements surrounding them, or even inside their linked polygon. Zones can also calculate room areas in very complex ways. In ArchiCAD, under Options/Zone Categories, Category names and numbers can be defined, as well as which zone stamp (of the available inside the loaded libraries) is to be applied to each zone polygon, according to its category. This means the user can actually assign custom zone stamps to zone polygons, if he creates special stamps for specific uses. This little exercise creates a simple new Zone Stamp, which we will call Zone Escape.RSM, that will first calculate the capacity of the room according to a square-meter-per-person ratio, adaptable for each zone stamp, but based on standard values depending on Zone Category. In effect, the fire departments’ criteria for calculating the capacity of a given space is usually based on multiplying the area of this space by a square-meterper-person ratio, related to the actual use of the space. For example, a nightclub’s capacity is counted on the basis of 0.5m2 per person (two people fit inside one square meter). On the other hand, a restaurant’s capacity will be calculated using a ratio of 2 square meters per person.

Make the Zone Stamp Choose File/New Library Part..., selecting Zone Stamp as format. A standard Object Editor appears; note that all the usual scripts are available, except the 3D script window. Zones cannot have a 3D script.

Parameters The parameter list already contains many parameters: These are all the Global Variables assigned to Zone Stamps. Click on the New button to add a new parameter, which is to be called CapacityRatio, and select Real Number as parameter type. Assign 1,000 as default value. The first lines of the 2D script will contain a routine for calculating the room’s capacity according to this ratio and the room area: 2.132

!*******capacity calculation calcapacity=ROOM_AREA/CapacityRatio

If the ratio is zero an error will occur. And if it is less than zero the calculation can give back a negative capacity, which is not desirable! So the following lines have to be written inside the Parameter Script, to avoid warning messages: !*******Error Control If CapacityRatio=0 THEN PARAMETERS CapacityRatio=1 ENDIF IF CapacityRatio<0 THEN PARAMETERS CapacityRatio=-CapacityRatio ENDIF

Bug? PRINT statements do not seem to produce any result while working on Zone Stamps. So telling the user his parameters are incorrect is not possible....

2D Script Next step is to check inside the 2D script the overall door width of the room, and compare it with the total width needed for the occupants inside the room to escape in case of fire. Again, local regulations establish the number of people that can escape through a onemeter wide door. This is the meaning of the escapefact parameter. The GV holding the overall width of doors inside walls surrounding the Zone is called ROOM_DOORS_WID (it seems to work even if the Zone has not been created using the Automatic Boundary Recognition method). !*******escape calculation escapefact=1/100 escapeneed=calcapacity*escapefact IF ROOM_DOORS_WID>=escapeneed THEN escapestring="Enough door width" ELSE escapestring="NOT ENOUGH DOOR WIDTH !!!" warnflag=1 ENDIF

Here we use the escapestring parameter so as to put one single TEXT2 instruction further down inside the 2D script. warnflag is used for displaying a bold 2D symbol if the overall door width is not enough for the room’s capacity: !*******text style DEFINE STYLE "text" "Arial",ROOM_LSIZE,1,warnflag SET STYLE "text" ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

What’s left is only the necessary code to display inside the stamp the room number, name, area, capacity and door width verification. So this is the complete 2D script of the new Zone Stamp: !*******capacity calculation calcapacity=ROOM_AREA/CapacityRatio !*******escape calculation escapefact=1/100 IF ROOM_DOORS_WID>=escapeneed THEN escapestring="Enough door width" ELSE escapestring="NOT ENOUGH DOOR WIDTH !!!" warnflag=1 ENDIF !*******text style DEFINE STYLE "text" "Arial", ROOM_LSIZE,1,warnflag SET STYLE "text" !*******2D symbol string=ROOM_NUMBER GOSUB 100 string=ROOM_NAME GOSUB 100 string="Area: "+STR(ROOM_AREA,3,2) GOSUB 100 string="Capacity: "+STR(calcapacity,1,0)+" p." GOSUB 100 string=escapestring GOSUB 100 END:!________________________ 100:!*******text typing TEXT2 0,0,String ADD2 0,-2*ROOM_LSIZE*A_/1000 RETURN

End note Too bad there is no GV giving the number of doors for each room. This could be useful for further fire escape calculations. It also seems difficult if not impossible to tell ArchiCAD in what direction people are going to evacuate, which is an essential part of fire escape regulations. For example, the Fire Officer wouldn’t permit you to let restaurant goers to escape through the kitchen, a hazardous environment, or the toilets, a dead end. Maybe a door could be scripted in such way that it would process the capacity of adjacent rooms (see the REQUEST -Zone Relations function), calculates the flux of people from one room to another, and sums up capacities feeding statistics back to other Zones... It’s time for a new API called FireCad! ©Laurent Godel 2000

Set it up for use Save the Stamp. Then, choose Options/Zone categories..., and inside the categories dialog box create your list of categories. Assign to each category the new Zone Stamp, from the pull-down list on the left. The field to the right allows you to assign default values for the stamp’s parameters, according to each category. Assign to each room usage type the adequate capacity ratio, according to your local regulations. Then click OK and start drawing Zones through a sample project file containing some walls and doors. The Zone Stamp informs you when there is insufficient door width to evacuate the number of persons that can fit inside each room. Please note that you will need to choose the Update Zones command after adding or changing doors, for the Zone Stamp to accurately display its calculations results.

Set it up in Options/Zone categories....

The user has a Zone setting box where they can adjust the nominal capacity of the room

Move them hotspots! It is always better to design your own hotspots than to rely on a default bounding box. With AC 6.5 onwards, you can now plant 3D hotspots to make it easier to pick up objects in 3D. In the 3D view, you usually get a cluster of hotspots around the zero XY plane of the object. If you want the hotspots to appear all at the top of the object, then build the whole thing downwards with the zero XY plane at the top. You can achieve this effect with something you have built the normal way up by using zzyzx and preceding the 3D script with a MULz -1. The zzyzx hotspot will point downwards. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Lattices – Winged Truss – 1 T

HIS is an interesting truss form, which I call a ‘winged truss’. It is here to show a way of building lattices that can done by one subroutine call and requires no trigonometry. This is a valuable learning exercise, including: • Smart stretchy algorithm (recalculates spacing) • Uses no trigonometry (done by XYZ locations) • The 2D script is written in the 3D window (?) • The members are made with TUBE command :-(

For would-be lattice builders, this is the most useful exercise in the GDL Cookbook.

This method is incredibly easy for making lattices, because one subroutine does all the work, you only have to tell it the XYZ locations of each end of a tube and the job is done. Even better, you get a totally accurate 2D image, scripted from within the 3D script!! All the 2D script has to supply are hotspots and labels. In the Cookbook, I have referred to this as the ‘AngleRod’ method, using a simple TUBE from point to point. !Winged 3D truss !Master Script tnum=INT(1+A/tlen) !Number of Trusses IF tnum<1 THEN tnum=1 twid=B !Width of Truss thit=zzyzx !Height of Truss !Resolution limits IF resl<4 THEN resl=4 IF resl>12 THEN resl=12 !Drawing in 2D or 3D? IF GLOB_SCRIPT_TYPE=2 THEN draw2d=1 IF truvu=1 THEN draw2d=0

Master Script GLOB_SCRIPT_TYPE is the key to automatic 2D scripting. It tells GDL when it’s busy drawing a 2D symbol; if it is then the flag draw2d is set to 1. Subroutine 100 does all the work in 3D. Every tube in the 3D can have a matching LINE in 3D also which is performed by subroutine 101. We can then do a project2 of the truss made with either tubes or lines.

3D Script Establish the subroutine 100 first, because this is what does all the work. Do one test member, which can be the lower tube. Because this truss is, in effect, a load of cylinders that all collide at node points, you are depending on the ability of shaded views to ‘z-buffer’ all the cylinders where they meet – i.e. to tidy up the junction. Thus the lower tube is improved in appearance by being extended by its own radius in each direction. The parameters for x1,y1,z1 and x2,y2,z2 and the tube radius are sent to the subroutines. If draw2d is positive, the action will be sent to subroutine 101 where a LIN_ command will draw a line instead of a cylinder. 2.134

!Winged 3D truss !ReWritten for Cookbook3 Nov 2000 PEN pcol3 MATERIAL tmat RESOL resl !Lower main member rad=t1diam/2 x1=-rad: y1=0: z1=0 x2=tlen*(tnum-1)+rad y2=0:z2=0 GOSUB 100+draw2d END:!-----------------------100:!Tube This routine works out !Define Phantom Points the position of x0=x1+(x1-x2) phantom points no x3=x2-(x1-x2) matter how wierd the y0=y1+(y1-y2) y3=y2-(y1-y2) start and end points. z0=z1+(z1-z2) It ensure clean butt z3=z2-(z1-z2) ends to all tubes. !Draw it TUBE 2,4,63, These two lines are the 0,0,901, polylines required to rad,360,4001, draw a cylinder. The x0,y0,z0,0, extra 1 gives you tidy x1,y1,z1,0, cylinders. 900 and x2,y2,z2,0, 4000 would give you x3,y3,z3,0 a mass of ink lines for RETURN each polygon on the 101:!Tube in 2D cylinder – horrid! LIN_ x1,y1,z1, x2,y2,z2 RETURN

Subroutine 101 only happens if PROJECT2 is working ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

3D script: continued The tube structure continues with the upper and the lateral tubes. Then the diagonal tubes are done as a series of FOR NEXT loops. They could all be done as one single FOR NEXT, but for the Cookbook I have done each set of tubes separately so you see how the thing builds up. All you have to do is to work out the relative x1,y1,z1, and x2,y2,z2 locations for each tube and you have won!


UG! There’s one problem with this 2D<>3D method! due to a bug in 6.x, you get a spinning beachball over the hotspots, even though the object functions correctly. Graphisoft, please fix this for the next issue!

The 2D symbol with a simple level of detail. Each member is represented by one line

The 2D symbol with a high level of detail – a truview. The full PROJECT2 is drawn. A detail study in an architect’s drawing might need such detail, but an engineer’s layout for a whole roof of trusses would prefer the simpler representation and the faster redraw time. !Winged 3D truss !2D Script HOTSPOT2 0,0 HOTSPOT2 A,0 HOTSPOT2 tlen*(tnum-1),0 HOTSPOT2 tlen*(tnum)-tlen/2,0 HOTSPOT2 -tlen/2,0 !Put Hotspots on each truss element FOR n=1 TO tnum HOTSPOT2 tlen*(n-1),0 HOTSPOT2 tlen*(n-1), twid/2 HOTSPOT2 tlen*(n-1),-twid/2 NEXT n !Crosshair on stretchy point p=-t1diam/2 This is where the real work LINE2 -p,0,p,0 happens. Normally you are LINE2 0,-p,0,p advised to script in 2D instead LINE2 A-p,0,A+p,0 of using PROJECT2. We have LINE2 A,-p,A,p done! the 3D script. PROJECT2 3,270,2 IF shownam THEN !Annotation fntz=2*t1diam*1000/A_ !Autosize DEFINE STYLE 'ttxt' 'Arial',fntz,1,0 SET STYLE 'ttxt' TEXT2 0,-t1diam,iden ENDIF ©Copyright Marmalade 1998, 1999, 2000, 2001

!Winged 3D truss !ReWritten for Cookbook3 Nov 2000 PEN pcol3 MATERIAL tmat RESOL resl !Lower main member All you have to do is rad=t1diam/2 send the values of XYZ x1=-rad: y1=0: z1=0 at each end, and x2=tlen*(tnum-1)+rad y2=0:z2=0 radius, and your TUBE GOSUB 100+draw2d will be built! !Upper main member rad=t1diam/2 x1=-tlen/2-rad: y1=0: z1=thit x2=tlen*(tnum-1)+tlen/2+rad y2=0: z2=thit GOSUB 100+draw2d !Outer long members rad=t2diam/2 x1=-rad:y1=-twid/2:z1=thit/2 x2=tlen*(tnum-1)+rad y2=-twid/2:z2=thit/2 GOSUB 100+draw2d y1=-y1: y2=-y2 GOSUB 100+draw2d !Upper diagonal tubes FOR n=1 TO tnum ADDx tlen*(n-1) rad=t3diam/2 x1=-tlen/2: y1=0: z1=thit x2=0: y2=-twid/2: z2=thit/2 GOSUB 100+draw2d y2= twid/2 GOSUB 100+draw2d x1=tlen/2 GOSUB 100+draw2d y2=-twid/2 GOSUB 100+draw2d DEL 1 NEXT n !Lower diagonal tubes FOR n=1 TO tnum ADDx tlen*(n-1) rad=t4diam/2 x1=0:y1=0:z1=0 x2=0:y2=-twid/2:z2=thit/2 GOSUB 100+draw2d y2= twid/2 GOSUB 100+draw2d DEL 1 NEXT n !Longitudinal diagonal tubes FOR n=1 TO tnum ADDx tlen*(n-1) rad=t5diam/2 x1=0: y1=0: z1=0 x2=-tlen/2: y2=0: z2=thit GOSUB 100+draw2d x2=tlen/2 GOSUB 100+draw2d DEL 1 NEXT n END:!-------------------------!Follow this with the !subroutines 100 and 101

2D Script The Hotspots are important – this truss is stretchy in length (and in height in the 3D window). A loop is used to put one on each truss node. There could be an option to omit this if it is a nuisance with too many hotspots. The Crosshair assists in finding the stretchy ‘A’ hotspot. 2.135

The GDL Cookbook 3 – Voyager

Lattices – Winged Truss – 2 T

HIS is the ‘winged truss’ again, but done in a quite different way. This is the more traditional craftsmanlike way to make one, showing a good level of detail. The truss has cast metal sleeved joints to the tubes which we want to display. This requires the use of Trigonometry, to get all the angles of the tubes precisely calculated. For manufacturing purposes, this would provide accurate feedback – as you stretch the truss, it can calculate and report back on the angles of the joints and the lengths of the tubes – this could be a written report for an engineer/fabricator. For general perspective drawing, or animation, one would like to shorten the drawing time – hence the truss can also be drawn with the joints concealed. This is a valuable learning exercise, including: • Using Trigonometry to calculate lattice members • Outputting data to file to inform the user of details and risks • Reading the system clock • Extensive 2D scripting, to save redraw time • Level of Detail awareness • Defining and Autosizing text in 2D symbols

Parameters If you have already built the previous Winged Truss, note that this has an identical parameter window, except for the addition of two parameters, simcom and outdat. So you could open the previous truss, erase the scripts and resave with a new name to save the effort of rewriting all the parameters. The truss has four different radii of tubing. Every linear element is parametrically definable. A and B are used to make the truss stretchy. The Master Script converts the A and B into ‘tnum’ and ‘twid’, from which the rest of the truss can be drawn. If you are starting from scratch, leave the optional parameters at the bottom of the list until you need them.

Master Script If the object is stretchy, make sure that you equate A, B and zzyzx to the parameters names you wish to use. the tnum routine is a way of counteracting the tendency of INT(…) to round down. (One could use a new function CEIL(… ) which is like INT but rounds up.) The next set of calculations use ArcTan and Pythagoras to work out the angles and lengths of tubing.

!Winged 3D truss !Master Script tnum=INT(1+A/tlen) !Number of Trusses twid=B !Width of Truss thit=zzyzx !Height of Truss IF tnum<1 THEN tnum=1 !Longitudinal Diagonal Tubing dtang=ATN(thit/(tlen/2)) dlen =SQR(thit**2+(tlen/2)**2) !Upper Wing tubing ang1=ATN(tlen/twid) ang2=ATN((thit/2)/((tlen/2)/SIN(ang1))) utlen=(thit/2)/SIN(ang2) !Lower Wing Tubing ltang=ATN(thit/twid) ltlen=SQR(thit*thit+twid*twid)/2 IF resl<4 THEN resl=4 IF resl>12 THEN resl=12

3D Script The housekeeping (like the angle and length of diagonal tubes) are all dealt with in the Master script. The 3D script can be dedicated to 3D. As this is a complex object, set out to structure the script, so put in the END 2.136

In some versions of ArchiCAD 6.5, the presence of trigonometry functions in the Master script causes Stretchy objects to have a spurious ‘divide by zero’ error – move the routine to the 3D and 2D scripts. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

statement early. The Lower and Upper and outer tube members (300: and 310:) are easy enough to do. Manoevre into position, rotate to point Z along the line of the truss and push out your cylinders. If the user has opted for the complex truss, then run the FOR NEXT loops that are sleeves for the joints. Because the sleeves are bigger than the tube, and have to accept diagonal tubes later, they are longer then their diameter. You need to make small adjustments in position to make the sit nicely. The sleeves sit nicely along the rods. The ones in the middle are the right length because they have to accept a total of 8 tubes arriving into them at different angles. The end tubes overhang too much, so a CUTPLANE routine is required to reduce the size of the end joints. Insert the CUTPLANE routine before you start with the 3D elements, to trim off the sleeve ends correctly. Add CUTEND: CUTEND just before the END statement

These two lattices depend on cylinders meeting exactly at nodes. If you need to trim them back for a perfect wireline view, use the Trig and Loop method, and push circular CUTPOLYAs along the lines of the main tubes to cut the ends of the minor tubes (not illustrated in this example).

Tips and Tricks Building Lattices


E CAN easily make non parametric lattices with the slab tool, laying out the shape, and then inserting holes, and finishing up with rectangular sectioned members. But if you stretch them, the sizes of all the members are distorted. Making a serious 3D truss this way is almost out of the question. Home built Parametric Lattice trusses are one way to impress people who think that everything should be done with AutoCAD. Challenge them to match that with AutoLisp! Here are four methods to think about. The Prism method: A lattice can be made as a PRISM_ with holes drilled. You can use arithmetic to work out how many holes to draw, PUT to store the outlines of the holes, and GET to draw the prism. You could also make the web of a castellated beam this way. This is somewhat limited to 2D trusses.

©Copyright Marmalade 1998, 1999, 2000, 2001

!Winged 3D truss: PEN pcol3 MATERIAL tmat RESOL resl

3D Script

CUTPLANE routine: Insert here

GOSUB 300 !Lower Tube GOSUB 310 !Upper Tube END:!---------------------300: !Lower Tube sleeves ADDx -t1diam/2 ROTy 90 CYLIND tlen*(tnum-1)+t1diam,t1diam/2 IF simcom THEN FOR k=1 TO tnum ADDz tlen*(k-1)-t1diam CYLIND t1diam*3, t1diam/1.5 DEL 1 The basic Cylinder is NEXT k the tube and ENDIF DEL 2 the Loop creates the RETURN sleeves 310:!Upper Tube sleeves ADD -tlen/2-t1diam/2,0,thit ROTy 90 CYLIND tlen*tnum+t1diam,t1diam/2 IF simcom THEN ADDz -t1diam FOR k=1 TO tnum+1 ADDz tlen*(k-1) CYLIND t1diam*3,t1diam/1.5 DEL 1 NEXT k DEL 1 ENDIF DEL 2 RETURN !Cutplane routines for ends CUTPLANE routine: ADDx -tlen/2-t1diam/2 you need this to trim ROTy -90 the sleeves CUTPLANE DEL 2 ADDx tlen*(tnum-1)+tlen/2+t1diam/2 ROTy 90 CUTPLANE DEL 2

The Trigonometry and Loop The ‘AngleRod’ method: is method: Using the technique of useful if the truss departs from the Lattice truss in the Discovery regular spacings or layout, and course, you can use arithmetic to has members in which there are work out how many lattice mod- so many angles and geometries ules required (or to calculate the that the trigonometry gives you module size); then use a For Next a headache. (I like trig, but you Loop. The cursor runs along the may not). In this case, you just use length of the truss, building each a macro like AngleRod in the Voymodule. ager course. You just specify the Along the way, you will have to start and end points, the sectional use trigonometry to work out the diameter, and whether the rod is angles of the truss members, and square or round. You do not aceither Cylinder, or a Squilinder tually need to call Anglerod, be(prism) to draw the members. (I call cause the routine using TUBE is this ‘knitting’). This needs some so short, it can be copied and serious maths if the truss is curved pasted as a subroutine into your or irregular in shape. (Winged main script. (Winged Truss-1). Truss-2) CUTPOLY method: First build your lattice as a solid block; then apply a series of CUTPOLYs to drill holes, leaving behind the structural members. This is a laborious method for a 2D lattice, but for a 3D lattice, it could be the easiest! Use Loops and PUT and GET to place them.


The GDL Cookbook 3 – Voyager

Lateral tubes The lateral (or wing) tubes are done in the same way. Do one of them, and then use a mirroring technique, using MULy -1, to do the other. The routine in 320 is done in exactly the same way as for the main tubes.

Diagonals The way to get the diagonals done is to start off by getting ONE module right, and the rest will be done with a FOR... NEXT loop. These diagonals are more complicated. The main tubes were long single tubes, and the sleeves were cylinders. In the diagonals, the sleeves are conical, and have to point in the same direction as the tubes. This is a good illustration of an object oriented approach – one cannot solve the problem in bits and pieces. One must get to the right place, summon the tube and it should arrive as a whole object, complete with its cones.

!3D Script, continued GOSUB 320 !Outer Lateral member MULy -1 GOSUB 320 !Outer Lateral member DEL 1 END:!-----------------300: 310: 320: !Outer Tube ADD -t2diam/2,-twid/2,thit/2 ROTy 90 CYLIND tlen*(tnum-1)+t2diam,t2diam/2 IF simcom THEN FOR k=1 TO tnum ADDz -t2diam ADDz tlen*(k-1) CYLIND t2diam*3, t2diam/1.2 DEL 2 NEXT k ENDIF DEL 2 RETURN

Passing parameters A standard subroutine (240:) has been developed for a Cylinder that has a cone at each end. (This gives the form of the sleeved joints). All you have to do is get the cursor to the right place, point it in the right direction, pass appropriate parameters to the subroutine, and it’s done. 260 calls 270 to get the cones. the parameters are clen (cylinder length) and diam (diameter). The subroutines have built in rules to decide how big the cones should be.

!All the diagonal tubes FOR k=1 TO tnum ADDx tlen*(k-1) GOSUB 200: !Do Diagonal Tubes GOSUB 210: !Upper Wing tubes GOSUB 220: !Lower Wing tubes DEL 1 These are the end of the cut NEXT k commands cutting the end joints CUTEND to the correct length CUTEND END:!-------------------------200: !Do Diagonal Tubes LET clen=dlen: diam=t2diam ROTy 90-dtang GOSUB 260 !tube Subroutine 260 does all the DEL 1 work, you just have to pass ROTy -(90-dtang) parameters to it GOSUB 260 !tube DEL 1 RETURN 210:!Upper wing tubes LET clen=utlen: diam=t3diam ADD 0,-twid/2,thit/2 !first upper ROTz ang1 ROTx 270 + ang2 GOSUB 260 !tube DEL 2+1 ADD 0,-twid/2,thit/2 !second upper ROTz -ang1 ROTx 270 + ang2 GOSUB 260 !tube DEL 2+1 ADD 0, twid/2,thit/2 !third upper


ROTz 180 - ang1 ROTx 270 + ang2 GOSUB 260 !tube DEL 2+1 ADD 0, twid/2,thit/2 !fourth upper ROTz 180 + ang1 ROTx 270 + ang2 GOSUB 260 !tube DEL 2+1 RETURN 220:! Do Lower Wing tubes ROTx 90-ltang clen=ltlen:diam=t4diam GOSUB 260: !Cylinder lower tube DEL 1 ROTx -(90-ltang) GOSUB 260: !Cylinder lower tube DEL 1 RETURN !----------------------------------260: !Cylinder lower tube IF simcom THEN GOSUB 270 !joint CYLIND clen,diam/2 IF simcom THEN ADDz clen MULz -1 GOSUB 270 !joint DEL 2 ENDIF RETURN 270: !Joint using a Cone CONE diam*2,diam,diam/1.5,90,90 RETURN ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Winged Truss The joints in this truss look good even at close inspection. Perhaps the cones at the end of each tube could be a bit longer. From this, one can derive the design of cast steel sleeve joints. One can get the script to write out to disk a list of the data for each tube – see later in this worksheet.

2D Script Whether youare to use the Truview (using Project2) or a scripted 2D symbol, you will need Hotspots to pick the truss up with. You also need to write the stretchy hotspots before you draw the truss. If the user prefers a scripted view (many seconds faster especially if you use the one with complex joints), the the script is below. the sequence is similar to the 3D in that you do a FOR... NEXT loop for the diagonals in each module, and then put in the main longitudinal tubes. As a rule, 2D scripting is easy if you use a similar structure as for the 3D (loops etc) As the truss has a name, it is possible to have it display its name in the 2D symbol, using TEXT2. The size of the Text is automatically calculated to be twice the diameter of the main tube.

!2D Script for Winged Truss HOTSPOT2 -tlen/2,0 !Stretchy HOTSPOT2 A-tlen/2,0 !Hotspots !Hotspots on each truss element FOR n=1 to tnum ADD2 tlen*(n-1),0 HOTSPOT2 0,-twid/2 HOTSPOT2 0, twid/2 HOTSPOT2 0,0 DEL 1 NEXT n IF shownam THEN !Annotation fntz=2*t1diam*1000/A_ !Autosize DEFINE STYLE 'ttxt' 'Arial',fntz,1,0 SET STYLE 'ttxt' TEXT2 0,-t1diam,iden ENDIF IF truvu THEN PROJECT2 3,270,2 ELSE RECT2 -tlen/2,t1diam/2, tlen*tnum-tlen/2,-t1diam/2 FOR n=1 to tnum This differs from the previous ADD2 tlen*(n-1),0 Winged truss in that the 2D POLY2 6,1, script is fully scripted, not 0, twid/2, depending on Project2. As there tlen/2,0, is still the mysterious bug with 0,-twid/2, the project2 solution, it may be -tlen/2,0, preferable to script it. There is no 0,twid/2, 0,-twid/2 trigonometry because in the DEL 1 plan view it’s possible to describe NEXT n locations using polygon points. !Lateral tubes RECT2 0, twid/2+t2diam/2, (tnum-1)*tlen, twid/2-t2diam/2 RECT2 0, -(twid/2+t2diam/2), (tnum-1)*tlen,-twid/2+t2diam/2 ENDIF

File Output


ou were offered the possibility of outputting to disk a file with the data about the truss. Here it is. You can now add the final parameters. First, it is important to know WHICH truss it is, as a building project may have several of different lengths. So we offer the user the chance to name the truss (‘iden’) and at the same time, we offer them the chance to turn off the feature (‘outdat’) – we don’t want dozens of trusses all simultaneously sending the same data to disk. If the user appoints a truss (the "show-truss") to do the work, the others can remain silent. By the way, the name ‘iden’ will determine the name of the file. This file will be placed in the ArchiCAD Data Folder. It takes the name of the truss followed by .TXT. ©Copyright Marmalade 1998, 1999, 2000, 2001

Add ‘outdat’ and ‘shoname’ to the parameters box IF outdat THEN GOSUB 500:!File I/O

Add this line to the executive script, just above the END statement.

Make sure that different trusses have different names, or later trusses will overwrite the file written by one that was processed earlier. 2.139

The GDL Cookbook 3 – Voyager

Date and Time We want to know the date of the report, in case it was different from the one we wanted. this, along with the name of the truss will appear in the report. Date and Time are not in the manual, but they are in a Readme file in your Add-ons folder. In the date&time script, one uses a REQUEST which investigates a resource in ArchiCAD called ‘DateTime’ that knows the system time and date. The strings using percent signs can extract the data. Actually, the whole time and date can be represented in a single string called ‘%c’, but to show you how the strings work, I have joined several ones together – %A gives the day of the week; %d the day number, &B the month; %Y the year and century (millenium bug proof! ha-ha!); %X gives the time in AM or PM. The rest of the DateTime strings can be found by reading the ReadMe file in the Add-ons Folder. The whole lot are combined into a text string called ‘dstr’.

The Report FILE INPUT and OUTPUT are covered in the appendix to the main GDL manual. If you are a Voyager, it’s time to read that appendix! But then you may feel like reading the Cookbook for light relief. First, the file must be opened and named, a channel defined, and you must set up the way in which the routine will separate data. The OUTPUT commands then follow; each time you remind it which channel you are writing to (in case you have more than one file open at once – you could be reading from one file, and writing to the other.) • The report adopts the name put into the ‘iden’ field in the parameters box. • The report has TABs (‘\t’)between fields, so you could copy and paste this to a spreadsheet – or you could reformat it so that it could be read in by Filemaker. • It’s a good idea to have carriage returns to separate groups of data. A report of this kind would be used as a cutting schedule for the tubing and the design of the steel sleeve joints in the truss. It is not really on to have it report in detail on structural matters, as you would require to ask the user to enter vastly more data, like Live and Dead loads, Kfactors, steel grades, joint characteristics etc. However, a report on slenderness ratio is a good example of providing a warning to the designer. This could also flash up in the 2D symbol. This report does provide the engineer with essential detail like tube lengths, from which calculations would be done – how else could those dimensions be derived, except by the engineer having to calculate them all again?


500:!File Output Routine !Get the Date and Time x=REQUEST("DateTime","%A %d %B %Y",dstr) x=REQUEST("DateTime","%X",tstr)

REQUEST results in a number (X) which can be discarded, but as a result of making the request, you obtain the value of ‘dstr’ and ‘tstr’. 500:!File Output Routine !Get the Date and Time x=REQUEST("DateTime","%A %d %B %Y",dstr) x=REQUEST("DateTime","%X",tstr) !Write the Report File ch1=OPEN("TEXT",iden+".txt","SEPARATOR='\t',MODE=WO") OUTPUT ch1,1,0,"Winged Truss Data:>",iden OUTPUT ch1,1,0,"Output Date:",dstr OUTPUT ch1,1,0,"Output Time:",tstr OUTPUT ch1,1,0,"Cutting Schedule for Tubes in mm." OUTPUT ch1,1,0," " CLOSE ch1 RETURN

OPEN: Channel 1 is opened to allow output to a file, in a Write Only mode (WO), using tabs (\t) to separate. OUTPUT: ‘ch1’ tells it where to send, ‘1’ tells it to start a new line (‘0’ appends to the most recent line), the ‘0’ does nothing. After that, you send the data you would like to have in the line, enclosing all text in quote marks. Winged Truss Data:> MainHall Output Date: Sunday 02 January 2000 Output Time: 17:33:04 Cutting Schedule for Tubes in mm. Upper tubes Number : 4 This is the kind of data Length : 2100 that you can get a report Diameter: 100 to produce. It is much Bottom tubes neater and more organised than a Number : 3 Components listing from Length : 2100 the Properties scripting, Diameter: 100 but it is more tiresome for Diagonal tubes people to have to ‘dig Number : 8 around’ in the ArchiCAD Length : 1594.52 data folder for the result. Diameter : 70 You should still try to give Declination: 48.8141 objects some Descriptor Upper Wing tubes and Components listing in the Property script. Number :8 Length : 2168.52 Diameter : 70 Angle in Plan: 30.2564 Declination :16.0625 Lower Wing tubes Number : 4 Length : 1897.37 Diameter : 70 Declination: 18.4349 Upper Tube Sleeves : 5 Bottom Tube Sleeves: 4 Wing Sleeves LeftH : 4 Wing Sleeves RightH: 4 Slenderness Ratios Upper : 1/ 21 Lower : 1/ 21 Diagonals: 1/ 23 UpperWing: 1/ LowerWing: 1/

31 27

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager


O not be dismayed by apparent complexity of this script. Like everything else, type in the first few lines, do a 3D view and see if it works by looking at the Data Folder to see what has landed there. Don’t forget that you must include the CLOSE statement or the file cannot be read. As you build up the text, you add in the extra lines. You need to be pretty precise about the format of the report, so each line is precisely worked out, and appropriate labelling text is put in, always enclosed in quote marks. When you have got the above text working, continue, line by line, until you have completed. You do not need to do all of course – by now, you should have got the idea. By the way, you notice that it is possible to include algebraic expressions in the OUTPUT statements, such as the ones that calculate Slenderness Ratio. It would be possible to express it as a decimal, but you can see that by playing with the layout, you can get it to lay it out in a more readable form. In this case, OUTPUT tells it to send, ‘ch1’ tells it where to send, ‘1’ tells it to start a new line (‘0’ should append to the most recent line according to the manual), the final ‘0’ does nothing at all. After all that, you send the data you would like to have in the line, carefully enclosing all text material in quote marks.

Tips and Tricks Doing it with Alpha Channels : think BIG! VERY VERY BIG!

©Copyright Marmalade 1998, 1999, 2000, 2001

500:!File Output Routine !Get the Date and Time x=REQUEST("DateTime","%A %d %B %Y",dstr) x=REQUEST("DateTime","%X",tstr) !Write the Report File ch1=OPEN("TEXT",iden+".txt","SEPARATOR='\t',MODE=WO") OUTPUT ch1,1,0,"Winged Truss Data:>",iden OUTPUT ch1,1,0,"Output Date:",dstr OUTPUT ch1,1,0,"Output Time:",tstr OUTPUT ch1,1,0,"Cutting Schedule for Tubes in mm." OUTPUT ch1,1,0," " OUTPUT ch1,1,0,"Upper tubes" OUTPUT ch1,1,0," Number :",tnum OUTPUT ch1,1,0," Length :",tlen*1000 OUTPUT ch1,1,0," Diameter:",t1diam*1000 OUTPUT ch1,1,0," " OUTPUT ch1,1,0,"Bottom tubes" OUTPUT ch1,1,0," Number :",tnum-1 OUTPUT ch1,1,0," Length :",tlen*1000 OUTPUT ch1,1,0," Diameter:",t1diam*1000 OUTPUT ch1,1,0," " OUTPUT ch1,1,0,"Diagonal tubes" OUTPUT ch1,1,0," Number :",tnum*2 OUTPUT ch1,1,0," Length :",dlen*1000 OUTPUT ch1,1,0," Diameter :",t2diam*1000 OUTPUT ch1,1,0," Declination:",dtang OUTPUT ch1,1,0," " OUTPUT ch1,1,0,"Upper Wing tubes" OUTPUT ch1,1,0," Number :",tnum*2 OUTPUT ch1,1,0," Length :",utlen*1000 OUTPUT ch1,1,0," Diameter :",t3diam*1000 OUTPUT ch1,1,0," Angle in Plan:",ang1 OUTPUT ch1,1,0," Declination :",ang2 OUTPUT ch1,1,0," " OUTPUT ch1,1,0,"Lower Wing tubes" OUTPUT ch1,1,0," Number :",tnum OUTPUT ch1,1,0," Length :",ltlen*1000 OUTPUT ch1,1,0," Diameter :",t4diam*1000 OUTPUT ch1,1,0," Declination:",ltang OUTPUT ch1,1,0," " OUTPUT ch1,1,0,"Upper Tube Sleeves :",tnum+1 OUTPUT ch1,1,0,"Bottom Tube Sleeves:",tnum OUTPUT ch1,1,0,"Wing Sleeves LeftH :",tnum OUTPUT ch1,1,0,"Wing Sleeves RightH:",tnum OUTPUT ch1,1,0," " OUTPUT ch1,1,0,"Slenderness Ratios" OUTPUT ch1,1,0,"Upper : 1/",(INT(tlen/t1diam+0.5)) OUTPUT ch1,1,0,"Lower : 1/",(INT(tlen/t1diam+0.5)) OUTPUT ch1,1,0,"Diagonals: 1/",(INT(dlen/t2diam+0.5)) OUTPUT ch1,1,0,"UpperWing: 1/",(INT(utlen/t3diam+0.5)) OUTPUT ch1,1,0,"LowerWing: 1/",(INT(ltlen/t4diam+0.5)) CLOSE ch1 RETURN


OMETIMES it is just too difficult to set up the background in ArchiCAD. Do you want to model the entire town or perhaps use a photograph of it as a background and spend hours trying to get it to line up with the model? Yes!.... but No, I havent got the time. Much easier still is to use a perfectly white background. When you save the render, ArchiCAD saves the background as an Alpha Channel. The proof is on the left – Photoshop displays the channel perfectly. Save as a PICT or a TIFF with no compression. This can be brought into Photoshop and laid over a photographic background. Make use of the transparency of the alpha channel. Anti aliasing is good, but for better results for images with alpha channels/transparency, render VERY LARGE with NO Anti-aliasing – like 4000 pixels wide! Remove backgrounds with 100% precision. Then rescale the image to the size you want. 2.141

The GDL Cookbook 3 – Voyager

Catamaran T

HIS CATAMARAN isn’t just here because I like sail ing. In fact I have only been on a catamaran once. Modelling one is a way of coming to terms with personal deprivation!(:-) The Cat looks at: • Using the COONS statement • Progressively encapsulating components into subroutines • Using TUBE to form linear elements ! M a s t e r S c r i p t First, establish len and cwid. Do it in the Masterscript so that both 2D • Value Lists and parsing len=A: cwid=B and 3D scripts will be informed. • Defining Materials Planning: OK, The catamaran is 3D Script: The easiest way to start not totally realistic – it’s a simple a COONS is to enter the FOUR cormodel to teach some GDL tech- ners only, first. Number the corners, niques. The main object of the exer- as in the diagram below. You get a cise is the contruction of the floats rectangle. Then, as in the script here, using COONS, and the TUBe for the add in the extra points progressively. rigging. Remember to increment the number For the float, you could use in the first line of the COONS, as you RULED, and it would perhaps be add the extra points. easier; but the forward end of the Although this is to be a catamabow curves upwards – so the ran made of of subroutines, my startCOONS statement is best for a more ing technique is to hammer in some sculpted 3D problem. basic code that works. So the early scripts here do not even have line Master Script: will grow as the numbers or subroutines. You only boat grows, but first you establish need to build half of one float, as you the roles of A & B. Add the rest in can mirror this to form one float, and later, when you have written the then duplicate the float to make the value lists. second float. COONS 2,2,63,!half float1 0,0,0, !Point 1 0,0,hit, !Point 2 len*0.9,0,0, !Point 4 len,0,hit*1.1, !Point 3 0,0,0, !Point 1 len*0.9,0,0, !Point 4 0,0,hit, !Point 2 len,0,hit*1.1 !Point 3

Stage 1:

COONS 2,3,63,!half float2 0,0,0, !Point 1 0,0,hit, !Point 2 len*0.9,0,0, !Point 4 len,0,hit*1.1, !Point 3 Stage 2: 0,0,0, !Point 1 Three points 0,wid*0.5,0, along the len*0.9,0,0, !Point 4 length 0,0,hit, !Point 2 0,wid*0.5,hit, len,0,hit*1.1 !Point 3 Stage 3:

Stage 1: Join up the corners only: in your sketch, number each corner

COONS 2,6,63,!half float5 Four points along the 0,0,0, !Point 1 length 0,0,hit, !Point 2 len*0.9,0,0, !Point 4 len,0,hit*1.1, !Point 3 Stage 4: 0,0,0, !Point 1 Five points 0,wid*0.5,0, along the len*0.5,wid*0.5,0, length len*0.7,wid*0.5,0, len*0.8,wid*0.32,0, len*0.9,0,0, !Point 4 Stage 5: 0,0,hit, !Point 2 Six points 0,wid*0.5,hit, along the len*0.50,wid*0.55,hit, length – Points are progressively added along len*0.70,wid*0.60,hit, finished! the hull, along the top and waterline. len*0.85,wid*0.4,hit*1.05, len,0,hit*1.1 !Point 3 COONS 2,4,63,!half float3 0,0,0, !Point 1 0,0,hit, !Point 2 len*0.9,0,0, !Point 4 len,0,hit*1.1, !Point 3 0,0,0, !Point 1 0,wid*0.5,0, len*0.5,wid*0.5,0,3 len*0.9,0,0, !Point 4 0,0,hit, !Point 2 0,wid*0.5,hit, 4 len*0.50,wid*0.55,hit, len,0,hit*1.1 !Point 3

The more points, the smoother the shape. All the locations are based on Side Elevation of hull, showing rising deck proportions of width and length. 2.142

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager !Catamaran Hull !for Voyager Course 100: !Half a float MATERIAL fmat PEN pcol COONS 2,6,63,!half float 0,0,0, !Point 1 0,0,hit, !Point 2 len*0.9,0,0, !Point 4 len,0,hit*1.1, !Point 3 0,0,0, !Point 1 0,wid*0.5,0, len*0.5,wid*0.5,0, len*0.7,wid*0.5,0, len*0.8,wid*0.32,0, len*0.9,0,0, !Point 4 0,0,hit, !Point 2 0,wid*0.5,hit, len*0.50,wid*0.55,hit, len*0.70,wid*0.60,hit, len*0.85,wid*0.4,hit*1.05, len,0,hit*1.1 !Point 3

Finished COONS statement with 6 points along its length, & a number allocated to it.

Once the half-float COONS code is working, convert it to a subroutine by putting in an END statement, and putting a number and a RETURN statement either side of the COONS. You still only have half a float! !Catamaran Hull !for Voyager Course !Floats ADDy (cwid-wid)/2 GOSUB 200 !Entire Float DEL 1 ADDy -(cwid-wid)/2 GOSUB 200 !Entire Float DEL 1 END !---------------100: !Half of a float MATERIAL fmat COONS 2,6,63, !half float 0,0,0, !Point 1 0,0,hit, !Point 2 ........ etc, etc, etc, etc, as above ........ len,0,hit*1.1 !Point 3 RETURN 200: !Entire Float GOSUB 100 !half float MULy -1 GOSUB 100 !half float DEL 1 GOSUB 110 !Deck RETURN

!Catamaran Hull !for Voyager Course PEN pcol RESOL 12 GOSUB 100 !Half Float END !-----------------100: !Half of a float MATERIAL fmat COONS 2,6,63, !half float 0,0,0, !Point 1 0,0,hit, !Point 2 ........ etc, etc, etc, etc, etc, ........ len,0,hit*1.1 !Point 3 RETURN

Left: The final COONS profile for a half float. Above: The same statement, cocooned into a new subroutine number 100:. 200: !Entire Float GOSUB 100 !half float MULy -1 GOSUB 100 !half float DEL 1 RETURN

Convert the 3D form to a whole float by repeating subroutine 100, and by using the MULy command for the repeat. Both floats now: To get the two floats balanced equally around the centre line, you need to offset the floats – the offset is equal to half the difference of the total width and float width. The routine that makes the float must itself become a subroutine (200). So we have two ‘nested’ subroutines. 110: The Deck is a COONS that uses the same coordinates as the upper edge points of the hull shape. Copy and paste. Make sure you still follow the procedure of doing the points in the order, 1,2~4,3~1,4~2,3. Next you need to add the crossbeams that join the floats, and then add in the mast, boom and sail.

!Master Script Now add mor e detail to the len=A: cwid=B Master script IF catmode='Starboard Tack' THEN tack=-1 IF catmode='Port Tack' THEN tack=+1 IF sailmode='Reaching/running' THEN tack=tack*2 IF masthit='Mast very high' THEN mhit=len*2.0 IF masthit='Mast medium high' THEN mhit=len*1.8 IF masthit='Mast short' THEN mhit=len*1.6 mastrad=mhit/150 !Mast Radius boomlen=len*0.5 !Boom length boomrad=boomlen/150 DEFINE MATERIAL 'sailcloth' 2, 1.0,1.0,1.0 DEFINE MATERIAL 'rigging' 3, 0.5,0.5,0.5 ©Copyright Marmalade 1998, 1999, 2000, 2001

110: !Deck sloping COONS 2,5,63, 0, wid*0.50,hit, !#1 0,-wid*0.50,hit, !#2 len, 0.0, hit*1.1,!#4 len,-0.001,hit*1.1,!#3 0, wid*0.5,hit, !#1 len*0.50,wid*0.55,hit, len*0.70,wid*0.60,hit, len*0.85,wid*0.4,hit*1.05, len,0.0,hit*1.1, !#4 0,-wid*0.50,hit, !#2 len*0.50,-wid*0.55,hit, len*0.70,-wid*0.60,hit, len*0.85,-wid*0.4,hit*1.05, len,-0.001,hit*1.1 !#3 RETURN 200: !Entire Float GOSUB 100 !half float MULy -1 GOSUB 100 !half float DEL 1 GOSUB 110 !Deck RETURN

VALUES 'catmode' 'Not Sailing', This is your 'Starboard Tack','Port Tack' Value List in the VALUES 'masthit' 'Mast very high',Parameter Script 'Mast medium high','Mast short' VALUES 'sailmode' 'Close hauled', 'Reaching/running'

As you get ready to move onto the Mast and Sailing details, add in the extra parameters, write a Value List in the Parameter Script, and then extend the Master script to ‘parse’ the value list – this creates flags (‘tack’) and internal parameters (‘mhit’, ‘mastrad’ etc). You can define Materials in the Master script. 2.143

The GDL Cookbook 3 – Voyager

Crossbeams 300: The cross beams are PRISMs which are better than BLOCKs, since you can generate them from the centre line of the boat. Make each one, and then DEL back to the origin before making the next one. Update the executive script to include the subroutine 300.

!Catamaran Hull !for Voyager Course PEN pcol RESOL 12 !Floats ADDy (cwid-wid)/2 GOSUB 200 !Entire Float DEL 1 ADDy -(cwid-wid)/2 GOSUB 200 !Entire Float DEL 1 !Cross beams ADDx len*0.1 GOSUB 300 !Beam DEL 1 ADDx len*0.55 GOSUB 300 !Beam DEL 1 ADDx len*0.85 GOSUB 300 !Beam DEL 1 END !------------

300: !cross beam piece ADDz hit-0.12 PRISM 4,0.1, -0.1, (cwid-wid) /2, +0.1, (cwid-wid) /2, +0.1,-(cwid-wid) /2, -0.1,-(cwid-wid) /2 DEL 1 RETURN

Time to add some more parameters! These are Values List ones – use ‘abc’ as the parameter type and click on the value list button.

Mast and Sails 400: You advance to the base of the mast, and push up a cylinder. To make sure the mast has the oval look of a mast, then you MUL the cylinder in the X direction. 450: At this point, you provide a parametric choice – the boat could be at anchor, or on Port or Starboard tack. It is more manageable to do the boom as a separate subroutine from the mast. The boom is angled at 20 degrees from the axis. If you have written the Value Lists, then you can use ‘tack’ and the other data from the Master Script to vary the angles of boom and sails. If the boat is not sailing, then the boom is in line with the boat’s axis. If it is sailing, it swivels 20 degs for ‘Close hauled’ and 40 degs for ‘Reaching or Running’. 500: In this exercise, the main sail is done as a PLANE, and not as a curved COONS mesh (which would look better), since the original focus of this exercise is on the scripting for the floats. A small amount of trigonometry is required to make sure that the 2.144

400: !Mast MATERIAL "Stainless Steel" ADD len*0.55,0,hit MULx 1.5 !make it oval CYLIND mhit,mastrad !mast DEL 2 RETURN 450: !Boom MATERIAL "Stainless Steel" ADD len*0.55,0,hit+hit ROTz tack*20 ROTy -90+5 MULx 1.5 !make it oval CYLIND boomlen,mastrad*2/3 DEL 4 RETURN 500: !Main Sail MATERIAL 'sailcloth' ADD len*0.55,0,hit+hit ROTz tack*20 IF tack THEN PLANE 3, !Flat Sail -mastrad,0,0, -mastrad,0,mhit-hit, -boomlen,0,len*0.5*COS(85) ENDIF DEL 2 RETURN

boom is allowed to slope at 5 degrees. PLANE is the easiest way to make a surface, as you only have to define the X-Y-Z points. It also helps to do the Sail as a separate subroutine, to make debugging easier.

Materials: Note that in the Master Script we defined the Material of ‘sailcloth’ – as a plastic-like material with an RGB value of 1,1,1 It still looks a bit grey – you need a bit of ‘emission’ to make it look whiter. At the same time, we can also specify a metallic grey for the rigging. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Forestay and jib 550: Whether you are sailing or at anchor, you need a forestay. This could be done with a CYLIND but would be a difficult piece of Trig. TUBE, in which you only need to know the X-Y-Z locations is far easier, once you get the hang. Do not forget the ‘phantom points’ with TUBE; in this case, 1000 metres up in the air and down in the deep! Use PUT and GET and BODY -1 to ensure that you have less risk of syntax or unexplained errors. RESOL can be 3, as it is a slender cable, and 3 will suffice. The jib itself is also a PLANE, swivelled at the same angle as the Mainsail.

550: !Jib !Forestay MATERIAL 'rigging' RESOL 3 PUT len*0.85,0, -1000, 0, len*0.85,0,hit, 0, len*0.55+0.1,0,mhit+hit,0, len*0.55+0.1,0,1000, 0 BODY -1 TUBE 2,NSP/4,63, 0,0,900, 0.01,360,4000, GET(NSP) BODY -1 IF tack THEN !Foresail MATERIAL 'sailcloth' MULy -tack PLANE 3, len*0.85,0,hit, len*0.55+0.1,0, mhit+hit, len*0.50, cwid*0.3, hit*2 DEL 1 ENDIF RETURN


Finishing off

2D Script

600: This further demonstrates the use of TUBE to do linear tasks. Instead of a multitude of trig calculations and cylinder commands, one single TUBE moving from XYZ location to the next can do it all in one sequence. A polyline with 900 and 4000 defines the cylindrical section, and RESOL3 makes the cylinder into a triangular section.

With all these extra subroutines, the executive script now looks like this.

Finally, you need to give the Cat a 2 D script for the stretchy hotspots to work, and as it may be difficult to pick up, additional hotspots enabling you to pick it up.

600:!Rigging RESOL 3 MATERIAL 'rigging' PUT len*0, cwid/2, -1 ,0, len*0.40, cwid/2, hit,0, len*0.55, 0.08 ,mhit,0, len*0.55,-0.08 ,mhit,0, len*0.40,-cwid/2, hit,0, len*0.00,-cwid/2, -1 ,0 BODY -1 TUBE 2,NSP/4,63, 0,0,900, 0.01,360,4000, GET(NSP) BODY -1 RETURN

!Catamaran Hull !for Voyager Course PEN pcol RESOL 12 !Floats ADDy (cwid-wid)/2 GOSUB 200 !Entire Float DEL 1 ADDy -(cwid-wid)/2 GOSUB 200 !Entire Float DEL 1 !Cross beams ADDx len*0.1 GOSUB 300 !Beam These could also DEL 1 be tidied away ADDx len*0.55 GOSUB 300 !Beam into a subroutine DEL 1 ADDx len*0.85 GOSUB 300 !Beam DEL 1 GOSUB 400: !Mast GOSUB 450: !Boom GOSUB 500: !Main Sail GOSUB 550: !Jib GOSUB 600: !Rigging END !------------------

!Stretchy Hotspots HOTSPOT2 0,0 HOTSPOT2 A*0.7,-B/2 HOTSPOT2 A*0.7, B/2 HOTSPOT2 0,-B/2 HOTSPOT2 0, B/2 !Pick up HOTSPOT2 HOTSPOT2 HOTSPOT2 HOTSPOT2

The use of BODY -1 ensures that TUBE works without unexplained errors.

Level of Detail At this point, you make decisions on level of detail. If you want a sea scene, this may be good enough, but if you are designing a marina sales area, you may want to add rudders, tiller, netting and more. Level of Detail (LOD) is a constant factor to consider.

!Catamaran !2D Script PEN pcol

Hotspots 0,-B/2+wid 0, B/2-wid A*0.55,0 A*0.85,0

PROJECT2 3,270,2

Fonts or what? Some people wonder at the font system in the Cookbook. Generally a headline in Garamond is for a section of Theory, and a headling in Frutiger is for an object building exercise. Tips and Tricks are all done in Frutiger. The Body Text throughout most of the GDL Cookbook is done in Garamond 10, exactly as in the Graphisoft manuals.

©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Squiffle – revisited by Bill Rattenbury, author of Project Framework

DNC writes: Earlier in the GDL Cookbook, you may have read about Squiffle, a magic (but really a very easy) technique for making line drawings look rough or hand drawn. This could be done to any line drawing brought into ArchiCAD. All you had to do first was to make a new LINE_TYPE, by drawing it, and pasting it along with a line name (like ‘Squiffle’) into the Options/Line Types dialog. Bill Rattenbury now comes up with this brilliant little piece of GDL that allows you to extend the lines, parametrically. You can of course roughen it even further by selecting the original Squiffle1 line type for the drawing. As this Squiffle2 takes a long time to draw because of all the disk I/O, I advise you to Explode the result, and then apply Squiffle1 lines to it.


OR the brave here is a GDL object script to make the line ends overshoot and cross each other. It is designed to work with the hidden line drawings created from the 3D view, and as such only supports pen colour and lines; everything else (arcs,circles,fills text etc) is ignored! What it does is read in a GDL script created by ArchiCAD of the lines and draws it as a single object with the line ends crossing. It randomly flips the lines to prevent the problem of parallel lines all squiggling the same way.

How to use Squiffle2 1) Copy the lines of a hidden-line view from the 3D window using the ‘flat’ marquee option. Start with something VERY simple! 2) Paste these into a empty corner of the floor plan. 3) Select all the lines with the pointer tool. 4) Open a new GDL script window (File/Open Library Part/GDL Script). 5) Drag the selected lines onto the open script window. You may need to resize your floor plan window so both are visible. 6) The lines get converted to text. Save the script into the ‘ArchiCAD Data Folder’ inside the ArchiCAD folder as ‘View1.gdl’ or similar. 7) Place this Squiffle object into the project floor plan, typing the name into the appropriate parameter field (windows users may need to add the ‘.GDL’). Watch it happen! You may need to zoom to fit in window to see the new object.

Summary So! I finally found a use for the mysterious SPLIT command! For complex perspectives this object gets VERY slow and it would need further development so it could work with floor plans and draw thick line ends etc. An API which could take a copy of your selected floor plan elements, explode them and squiffle them would be much faster and easier to use, any C programers keen? ;-)

This catamaran looks a lot more sketchy with the Squiffle2 treatment! ! Squiffle2 Sketch Object 2d script ! Check that a file name has been inputted IF STRLEN(file_name) > 0 THEN ! Set up the variables LET pen_num = 1 LET Ln_In = "" ! Scale the overshoot to page millimetres LET overshoot = overshoot*GLOB_SCALE/1000 SET LINE_TYPE L_Style1 ! Open a Text File Channel, called 'ch1' ch1=OPEN("TEXT",file_name,"separator='/t',mode=RO") LET row = 1: LET n = input (ch1,row,1,Ln_In) WHILE n <> -1 DO IF n = 1 THEN IF strstr(Ln_In,"LINE2")>0 GOSUB 100 IF strstr(Ln_In,"PEN") >0 GOSUB 50 ENDIF LET row = row + 1 LET n = INPUT(ch1,row,1,Ln_In) ENDWHILE WHILE ENDWHILE is a good (and safe) CLOSE ch1 way of reading through a textfile when ENDIF you don’t know where it’s going to end END:!---------------------------------50:!Split command extracts Pen setting m = SPLIT(Ln_In,"PEN %n",Pen_bit,pen_num) RETURN 100:!Split command extracts Line parameters m = SPLIT(Ln_In,"LINE2 %n, %n, %n, %n",Line_bit,X0,comma1,Y0,comma2,X1,comma3,Y1) LET scale_ratio=overshoot/MAX(SQR((X1-X0)^2+ (Y1 - Y0)^2),0.0001) IF scale_ratio>1 THEN LET scale_ratio=0 PEN pen_num LET Xoffset = (X1 - X0)*scale_ratio LET Yoffset = (Y1 - Y0)*scale_ratio !Randomly draw the line backwards IF RND(2)>1 THEN LINE2 X0-Xoffset,Y0-Yoffset, X1+Xoffset,Y1+Yoffset ELSE LINE2 X1+Xoffset,Y1+Yoffset, X0-Xoffset,Y0-Yoffset ENDIF RETURN Scale_ratio checks that the line will be longer than the overshoot. This prevents curved surfaces made of short line segments from looking like little ‘fire wheels’

©Bill Rattenbury, email:


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Cable Macro T

HIS exercise investigates a use ful feature of TUBE command, & !Test TUBE to make coiled cable !Simple Non parametric demo shows how to make a Macro. RESOL 6 The last digit in the Pathway defini- rad=0.5 !Radius tion of a TUBE command is a Twist an- PUT 0,0,-1,0,!twist 0,0,0,10, gle. (The best stories always have a twist 0,0,1,20, at the end.) If this angle progressively in0,0,2,30, 0,0,3,40, creases, then the section twists as it 0,0,4,50, moves through space. The first exercise 0,0,5,60, shows simply how this is done. The an0,0,6,70 gle is always absolute, not relative. 10, 'whitewash' 10, 10, will go straight, 10, 20, 30 will MATERIAL PEN 1 twist. TUBE 2,NSP/4,63, 0,0,900, MACROS are objects that can be rad,360,4000, called by other GDL scripts and that beGET(NSP) have like a command. For example, the command CYLIND calls up a cylindrical shape with parameters H and R. This one could be called ‘TWISTCYL’ or ‘COILCABL’ and only needs the 4 parameters shown on the right. The 900 and 4000 define a circular section; if these were 901 and 4001, the twisty lines would disappear. If you have smoothness ON in photorendering this form gets smoothed and the macro is useless – with smooth- MATERIAL 'Zinc' ness OFF, you can clearly see the twists. PEN L_ CALL coilcabl PARAMETERS l=5, Because it will be used as a Macro, d=0.4,n=8,t=6 it’s easier to use single letter variables. It This is how it can be used as a macro can now be used like CYLIND.

!‘Coilcabl’:GDL Macro !Error checking IF n<3 THEN n=3 IF n>12 THEN n=12 IF t<1 THEN t=1 IF t>10 THEN t=10 RESOL n FOR z=-d TO l+d STEP d tw=tw+t^2 PUT 0,0,z,tw NEXT z BODY -1 TUBE 2,NSP/4,63, 0,0,900, d/2,360,4000, GET(NSP) BODY -1

This is a Parametric way of doing the cable so this can be a Macro, used like CYLIND, up the Z-axis

Architects can create Web sites

Deliberate Errors



OES anyone out there have experience of creating and manag ing their own web page... >Neil

ES, most architects do their own pages themselves nowadays. With the plethora of absurdly easy visual design tools (no html programming required) the idea of a designer paying another designer to put his image out there is not necessary. Even if you had a graphic designer start it out for you (logos, menus and all) you will definitely want to maintain it yourself and update your samples of work, personnel, skills, and, of course link to your project-specific-web-sites which may be the single most important reason for a project architect to get into web technology. Over the years I have tried countless web-writer softwares, free and paid for, both Mac and Windows. Though I still use PageMill myself as my primary tool, I would recommend that most people just download the free NetscapeCommunicator4 which includes a very very useful PageComposer. You can leave PageComposer open while viewing with Navigator live and drag and drop images. It will automatically put any graphic files together in any empty folder you pick (to keep a local version on your own hard drive) and automatically Publish the whole site to whichever provider you specify. It even has built in wizards that will design a preliminary page or whole site FOR you. Hard to beat free AND easy AND good. >Geoffrey Moore Langdon, AIA ©Copyright Marmalade 1998, 1999, 2000, 2001

OMPUTERS work in Machine Code, we work in the world of Applied Maths. We humble earthlings use feet and inches, or millimetres or metres. In between the two, there may be conversion stages like Decimal and Hexadecimal and Binary. Sometimes when you divide two numbers, or use the INT command, you get tiny errors as a result of this conversion. For example 1/3 produces a recurring number in decimal. INT(9/3) could produce a result of 2 instead of 3 due to tiny conversion errors. FOR k=0 TO 10 STEP 5/2 should produce 4 intervals and 5 locations; but this could result in one of them being lost. Nobody notices small dimensions like 1/256” or 1 millimetre. So if you write FOR k=0 TO 10+0.001 STEP 2.5, you will eliminate the conversion error, but you will not alter the model at all. I noticed recently that if you divide 6’-0” by 3’-0” you get an error. If you divide by 6’-0” by 2’-11.9999” (yes you can use decimals) you guarantee getting a result of 2. If a piece of GDL simply doesn’t work when it should, look for the opportunity to feed in a deliberate error. 2.147

The GDL Cookbook 3 – Voyager

Secrets of Wrapping Textures T

HIS is one of the greatest mysteries of GDL. Every ArchiCAD user asks, at some stage, how can I make a texture start from exactly where I want it to start, scale it, rotate it, and make it go in the direction I want it to go in? For flat objects such as a building facade, this question can be solved with a picture object. But many objects, such as the curvy flag or the cyclorama, are curvy or complex. The GDL manual tries to help, but makes matters worse for most readers – including me. The ‘knowledge’ gets around at training courses and by word of mouth. And here it is now, in writing. We are going to map this texture on to this Prism – and then try different orientations and starting points. The normal way to make a material is known to most ArchiCAD users – use the Options/Materials menu selection and it’s easy enough. The information about the material is stored in the Project file. But this doesn’t work for all users. The Flagpole here is an example of where you couldn’t expect the user to make materials this way for every flag, and the cyclorama material would also be a nuisance for the user to set up – but you could make the GDL do it for you.

DEFINE MATERIAL: You can make materials in GDL. There are many ways: 0: General definition in which you specify 16 characteristics (including the RGB colours, reflection, transparency, emission). 1: Simple definition, in which you only specify 9 (including RGB and reflection) 2-7: Predefined definition, in which the qualities of reflectivity and transparency are already known in materials such as Matte, Metal, Plastic, Glass, Glowing and Constant. 10-17: Then these are repeated with a single added parameter for Fill. 20-27: These are all repeated again with 3 added parameters, fill, colour of fill and index of Texture. See the examples in the manual, and in the Flagpole and the Cyclorama for further detail.

PRISM shape _ using Polylines

Texture chekpatn.jpg

2: Matte: non reflective 3: Metal: shiny but non reflective 4: Plastic: not shiny, but reflective 5: Glass: transparent (with colour) 6: Glowing: with colour 7: Constant:: horrid! no shading

Predefined Material types DEFINE TEXTURE: For GDL to make a material with a texture it has to have a texture defined, and that texture has to have an index number. If you look at the familiar material-making dialog, you can see that having selected your colour file to be the texture, you specify the size of texture (x and y), the rotation angle and how it responds to alpha channels. The GDL command does exactly the same thing, DEFINE TEXTURE ‘chekpatn’ ‘chekpatn.jpg’, 1.0, 0.75, 1,0 txtrnum=IND(TEXTURE,’chekpatn’)

We use the IND( ) expression to find the Index number of a texture or material. When you make the Material, you can use a general (as in the flag) or here, we use a predefined one, the plasticky one (20+4). DEFINE MATERIAL 'chekmatl' 24, 0.9,0.9,0.9, !RGB 0,61,IND(TEXTURE, 'chekpatn')

The manual tells you to put a comma between the texturename and the texture bitmap. But you must not! 2.148

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager !Working out how textures are mapped !Nov 2000 DNC DEFINE TEXTURE 'chekpat' 'chekpatn.jpg', 1,0.75,1,0 DEFINE MATERIAL 'chekmatl' 24, 0.9,0.9,0.9, !RGB 0,61,IND(TEXTURE, 'chekpat') MATERIAL chekmatl Wrapping modes: BODY -1 PRISM_ 9+2,2, These are illustrated in the GDL 0.00,0.00,15, manual, and here: 1=planar, -1,3,15, 1,3,15, 2=box, 3=cylindrical, 1,4,15, 4=spherical, 5=cylindrical with 2,4,15, rectangular to top and bottom. 2,1,1000+15, 1.5,1,15, 1.5,0.00,15, 4 0.00,0.00,-1, 3 2,2.5,915, 0.8,360,4015 VERT 0,0,0 !Origin VERT 1,0,0 !X direction VERT 0,1,0 !Y direction 1 VERT 0,0,1 !Z direction 2 COOR 2,1,2,3,4 The 3-pointed star BODY -1

Wrapping modes 1 2 3 4 5 Here, the origin is at the extreme left corner of the prism and the 3-pointed star is perfectly cubic.

Wrapping the texture: VERT+COOR Here we use the same prism that we have used before, but it’s a bit larger. There are so many different ways of mapping texture, we are going to have to print many small rendered images showing what happens in each case. The statements which -1 define the position of a BODY PRISM_ 9+2,2, texture are VERT and 0.00,0.00,15, COOR. These are all writ- -1,3,15,..... ten after the object that is etc, etc same as above .....2,2.5,915, to be textured. 0.8,360,4015 Four VERT statements VERT 2,2.5,0 !Origin set out the location, and VERT 3,2.5,0 !x-direction VERT 2,3.5,0 !y-direction COOR does the wrap- VERT 2,2.5,1 !z-direction ping. The process is COOR 1,1,2,3,4 ended with a BODY -1 BODY -1 statement. The first VERT statement is the starting point (origin) of the texture. Then from that point there are the three locations which define the X, Y and Z direction. If the 3 pointed star you thus create is cubic, you will get nicely precise wrapping, but you can deliberately distort the shape of the star to create distortions in the texture. The COOR statement is thus:

Wrapping modes 1 2 3 4 5 Here, the origin of the 3-pointed star has been moved to the centre of the hole.

COOR, wrapping mode,vert1, vert2, vert3, vert4

Follow that with BODY -1. There are other modifiers to wrapping mode, -1 256,1024, 2048 and 4096. BODY PRISM_ 9+2,2,

Try it! This whole technique is definitely worth exploring once you have the idea. Its been fun writing it. 2 exercises in the Cookbook explore this technique, the Cyclorama and the Flagpole.

0.00,0.00,15, -1,3,15,...... etc, etc, same as above .....2,2.5,915, 0.8,360,4015 VERT 0,0,0 !Origin VERT 1,1,-0.5 !x-directn VERT -1,1,-0.5 !y-directn VERT 0.5,0.5,1 !z-directn COOR 2,1,2,3,4 BODY -1

©Copyright Marmalade 1998, 1999, 2000, 2001

Here the origin is back to 0,0,0, but the X,Y and Z locations have been modified so that the 3pointed star is tilted. 2.149

The GDL Cookbook 3 – Voyager

Create a CYCLORAMA for your VR Panorama Just like building a set for the movies! by Dwight Atkinson, GDL by David NC


VR panorama’s realism is enhanced by an intermediate background. To create one, insert an object, known in movie parlance as a ’Cyclorama’, into the ArchiCAD environment surrounding the project being modelled. In the rendering background, place a photo of clouds and sky scaled to suit the VR panorama size chosen, tilted CCW 90˚ to match the VR rendering routine. [Observe a VR render being made once and you will understand: ArchiCAD makes VR panoramas tilted sideways and later rectifies the image.] This example uses a panoramic scenery photo stitched together into an image that fills the panorama at the ratio needed to simulate forest trees. [If they look too big, this is just another way to know that it is time to visit British Columbia.] By placing the image in the ArchiCAD library, it can be used as a texture map applied to the surface of the cyclorama. Do not scrimp on image size: this image is well over 3000 pixels wide. The image must not be saved as a JPEG. It must be uncompressed – a TIFF, a PICT or a BMP. This object provides a surface to support context phoTry it without GDL tos of the neighborhood of the project, but is not the absolute background. Compared to measuring and The 3D object is a cylinder. First try it using Profiler to modeling the entire city, it reduces the complexity of make the cylinder. You will have to make a Material the model and shortens rendering time. Several of these (in the options material) from the cyclorama image. objects of different sizes could be nested together for You will have to map the image to the exact perimeter of the cyclorama object to avoid overlap; calculate the a layered, theatrical effect. perimeter of the object using the formula: PI x diamThe object is an empty cylinder. It can be scaled to eter to establish the width of the mapping image. Conthe diameter and height needed to approximate the strain the proportions of the scaling and note the height distance and height of the context to be created. of the image after the width fits the cyclorama perimThe trick is in preparing the scenery painting. In a eter. If you are not accurate enough and a vertical seam real context, you should use a photographic panorama, shows in the rendering, add a unit to the horizontal stitching the overlapping pictures into a smooth 360˚ size. Keep trying. Use the height of the image as the cyclorama using an application like VR Authoring Stu- height of the cyclorama. dio or Spin. This will give you absolute control over The height of the cyclorama is critical. It must not the ‘size’ of the background: once the perimeter ‘length’ exceed the height of the image. If the cyclorama is too of the cyclorama is established, the relative ‘height’ tall, ArchiCAD will repeat the image at the top. You results. To create accurate height, you’ll need to deterwill see this in the render if it happens. The shadow mine the height and distance of a prominent object in algorithm ignores alpha channels, so you may get a your photos from which to scale. big shadow across your final picture. A big mess. Using a photo editor, make the sky transparent by masking it with an ‘Alpha Channel’. This simplifies Try it with GDL making a quality photographic cyclorama: clouds and The GDL object supplied here takes all the guesswork exposure variations in the sky can be difficult to match. out of it. It builds a texture and a material from the Mountain photography by Jennifer Lamb


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

main image. It accurately maps the image to the cylinder, starting from the ground, and stretching it to fit perfectly no matter what radius or height you specify. You can stretch the cylinder in the 3D window, and you can make the planform ellipical. It removes the shadow. The GDL anchors the texture to start at the most eastward point of the cylinder.It prevents the groundline from repeating itself in the sky. For realistic shadows of the actual trees or mountains, magically create a PIPG from the alpha channel with ArchiCAD’s new fantasy utility PIPGMaker, available from wizards in a far-off land somewhere. The Italians figured it out somehow. They think they are so smart. But ask them to fix a car and see what happens. The image map will be represented starting from the origin of the object, the most eastward point. If you find that your image is not correctly oriented, rotate the object to suit. The image map will also rotate. Trial and error is required here as the rendered view is the only place where the mapping can be seen. For this example, a diameter of almost one hundred metres was chosen. This is a good start, but is probably too small for a building project with multiple VR scenes. To rescale, just stretch to a new size and the object will stretch the original image image map proportionally. If you use Profiler or the Wall tool, you will have to go back to the calculator. Don’t spin too fast. You’ll get dizzy. Dwight

!Cyclorama Object !Article by Dwight T Atkinson MAIBC !GDL by David NicholsonCole !3D Script !Define the Texture DEFINE TEXTURE 'cyclotxtr' filenam, 2*PI*A/2,zzyzx*1.05,1,0 DEFINE MATERIAL 'cyclomatl' 22, 1,1,1,0,61,IND(TEXTURE,'cyclotxtr') !Make the Cylinder This routine saves you the SHADOW OFF trouble of making a TOLER 0.2 MATERIAL 'cyclomatl' material in the project – MULy B/A stretches the image to fit the

cyclorama precisely

BODY -1 EXTRUDE 2,0,0,zzyzx,48, 0,0,901, A/2,360,4001 !Map the texture cylindrically VERT 0,0,0 VERT A/2,0,0 This routine remove the trial and VERT B/2,0,0 VERT 0,0,zzyzx error – ensures that the mapping COOR 3,-1,-2,-3,-4 is cylindrical around the centre BODY -1 ©Copyright Marmalade 1998, 1999, 2000, 2001

If you use the Profiler method, get ready to spend a long time with your calculator figuring out the optimum width and height !Cyclorama Object !2D Script PEN pen2d HOTSPOT2 0,0 HOTSPOT2 -A/2,0 Stretchy Hotspots HOTSPOT2 A/2,0 HOTSPOT2 0,-B/2 Stretchy Circle 2D HOTSPOT2 0, B/2 !Draw the Circle Extra Hotspots MUL2 1,B/A CIRCLE2 0,0,A/2 IF hoton THEN !extra hotspots FOR ang=30 TO 331 STEP 30 HOTSPOT2 COS(ang)*A/2,SIN(ang)*A/2 NEXT ang Label – no matter how ENDIF lazy you feel, you DEL 1 must never omit to !Label Define Style before td=2*A_/1000 writing 2D text IF labl THEN DEFINE STYLE 'labltext' arial,2,1,0 SET STYLE 'labltext' TEXT2 0,-td,'Cyclorama Centre' ENDIF CIRCLE2 0,0,td/3 !Centre circle LINE2 -td/2,0,td/2,0 LINE2 0,-td/2,0,td/2 !Crosshairs IF crosh THEN DEFINE LINE_TYPE 'croshair' 5.0, 4,0.002,0.008,0.0,0.008 Define LINE TYPE. SET LINE_TYPE 'croshair' LINE2 0,0,-A/2-0.2,0 This will only work if LINE2 0,0, A/2+0.2,0 you tick ‘Use object’s LINE2 0,-B/2-0.2,0,0 Line types’ in the LINE2 0, B/2+0.2,0,0 settings box. ENDIF

Scripts: 3D: defines a Texture and Material. Later in the script, it maps it to the east corner of the cyclorama – see the section on Texture mapping for full explanation. TOLER is used for curvature so that the resolution is adjusted no matter how large the cyclorama.

2D: Define LINE_TYPE. This makes a dotted line for the cross hairs. The spacing of the line here is 5 metres, and the small numbers are alternating lines and spaces. Multiply the index of the segments lengths by the spacing to get the actual length of each segment. 2.151

The GDL Cookbook 3 – Voyager

VR Rendering with Backgrounds W

E all know that ArchiCAD provides us with a library of backgrounds. These are best for single views and have the disadvantage of being unable to change when you change the camera position, so that a cloudy sky looks quite unconvincing during a flythrough – it is always static with the same cloud being in view. You can rectify this somewhat for a VR file by taking one of the ArchiCAD skies, and repeating it many times, stitching it together in blocks (flip horizontal each time so that the clouds join) until you get a file several thousand pixels wide. Rescale it to an exact size which must be divisible by 96. The short dimension must be divisible by 4. ArchiCAD works this out for you, but if you are in Photoshop, you need this table in the Cookbook. When you run the VR, make sure that the large dimension will be exactly the same as the background size. Even then you sometimes get a vertical break line. Why does the long dimension need to be divisible by 96? Well, a Quicktime VR is actually a movie of 24 tiles which rapidly slide past your vision as you scroll. Any one tile must contain a number of pixels divisible by 4. That makes 96 as the common divisor. In digital VR using a camera, the proportion of width to length is variable. I have done digital photography VRs where the ratio is between 6.5 and 8 depending on how steadily you hold the camera and the wide angle ability of your lens. As the image is stitched, it is cropped top and bottom if you do not use a perfectly balanced tripod. A very bad photoshoot will result in a ratio of 8, and if you can get it down to 6 you have done very well. In a CAD package, there is no dodgy tripod or rough pavement, so you get a better ratio – more like that of PI, 3.14. ArchiCAD has its own set of ratios, so here is the table of preferred sizes. 304 x 960 336 x 1056 368 x 1152 396 x 1248 428 x 1344 460 x 1440 488 x 1536 520 x 1632 552 x 1728 580 x 1824 612 x 1920

640 x 2016 672 x 2112 704 x 2208 732 x 2304 764 x 2400 796 x 2496 824 x 2592 856 x 2688 888 x 2784 916 x 2880 1008 x 3168

For VRs you are concerned mainly with screen display, and with opportunities for putting walkabouts on the web. You do no need anything like the high pixel definition of a finished static render where you might be looking to get 300dpi or higher in quality. The ideal window size for viewing a VR is 360 x 240, and if the background panorama image is 796 x 2496, that gives plenty of detail for the user to zoom in onto, and plenty of scope for looking up and down as well as around. 2.152

Let’s make a background The Sunset is a good one to start with because it has many horizontal lines. Sharp eyed readers will point out that sunset is always in the west, and the view to the other horizons would be darker. True! But lets talk about technique. You can apply this idea to cloudy skies, perhaps ones you have photographed yourself. For this, use Photoshop or a good bitmap editor. This sky is 1024 x 768 (fits a normal 2-page display perfectly) Open it, and save as a new test file. Rotate it CCW so that it is upright. Make a New file and set its size to 1400 x 5000. Select All in the sky file, copy and paste it to the new file. Move one paste to the top, paste again and move the second to the lower middle. Return to the sky file, flip vertical, select all and then paste it into your new file, move it to the upper middle. Paste again and move to the bottom. Avoid the pastes overlapping. Once the images are in the new (big!) file, zoom in closer and dock them carefully, avoiding a white pixel gap between images. Because one has flipped them, they meet perfectly, but the image develops something of a ‘Rorschach test’ look about it.

Here is the starter file, so rotate it CCW 90˚. When the part images are docked, crop off the surroundings. Do not lose pixels at top or bottom or the image will not wrap nicely when it meets in a 360˚ surround. Finally, untick the proportions checkbox and repixellate it to one of the sizes in the table. Save it into an active ArchiCAD library. Use this in conjunction with the Cyclorama and the mountains will be visibly different from the sky, enhancing the 3D effect. With these two techniques, you are ready to V-Rumble!

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Cast Shadows with Alpha Channels without GDL by Steve Campbell, introduced by DNC


AN Alpha channelled picture objects or texture maps cast shadows in ArchiCAD? No they cannot! Or so it seems. Perhaps we can? Anybody who has used picture objects, or mapped textures on to a surface is disappointed to find rectangular shadows being cast. This is particularly distressing in the case of people and tree figures. One solution is to do it in Artlantis – but we are talking ArchiCAD in the GDL Cookbook – this is where we want the shadows to work just as well. Another solution was discussed in the article in the Discovery section (‘People who face camera’) using people as an example. Trace the outline of the tree or the people figures with the slab tool and write some GDL. Map the texture onto it using COOR and VERT. First, there is a solution available in 6.5 onwards, using the special menu and not using GDL at all. It works like a treat! Then we look at the COOR solution.

Check on the width to height ratio of the image and apply this to your wall

Let’s make an alpha-Dwight! I have chosen a photograph of one of the Cookbook editorial team, Dwight Atkinson. Do this with Photoshop or a good bitmap editor. First thing to do is to remove the background. This is painful to do as DNC and Dwight’s wife were in the background. Once the whole background is completely white, use the magic wand to grab the background, CUT it (Cmd-X). In the Channels Palette, make a new channel, and call it ‘Alpha’. Click into that channel. If it is not already black, use the paint pot to fill it with black. Drop the black into the alpha channel, not all over Dwight in the RGB channels. Then Paste (Cmd-V) the background into the Alpha channel. Click off, then select all, and INVERT it so that the background is now black and the area where Dwight is standing is white.

Note the size of the image. If you think Dwight is 1.8 metres high, use the Image settings window in Photoshop to tell you how wide the image will be. Save this as a TIF or PICT or BMP into an ArchiCAD library, but do not use any of the compression formats (JPG, GIF). If you are already in ArchiCAD, reload your libraries, including the one that contains this file.

Now get it working in ArchiCAD Steve Campbell writes: In ArchiCAD, first create a new material [it’s easiest to duplicate an existing one like marble and adapt it]. Make sure the expert options are showing. Hit the Edit Texture button. Now you'll want to choose your tree or person picture as the applied texture. It needs to be a picture with an alpha channelled background. You can use the Search button to find it. It has to be a picture located inside a loaded library. Once you've picked your picture set the width and height of the texture to the right size. [You have a button in the dialog box allowing you to set the proportions according to the size of the image]. Write these values down somewhere. Next under the Alpha Channel Effects section check the Transparency option. ©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Build the wall Next go back to the plan window. Pick the wall tool. Set the wall thickness to 1/64” or 1 millimetre. Set the top, bottom, and side materials to the new material you just made. Set the height of the wall to the height you gave to your tree picture. Now draw a wall and make its overall length equal to the width of the tree picture.

Above: Ensure that the proportions match those of the image, and that you have ticked the Transparency box Below: The wall settings, with the height, thickness and material

In Photorendering settings, choose Shadows on, and click the Options button. Tick the ‘Use transparency in shadow calculation’.

Map the picture – use ‘Special’ menu The last step involves setting the vector fill origin. This make sure that one copy of the tree or person picture fits exactly to the wall. You'll need to turn on the Special menu. To do this hold down the CTR + ALT keys or CMD + OPTION keys as you start ArchiCAD. Once you start you'll have a new menu called Special. Now to set the origin go to the 3D Window. Set the User Origin to a bottom corner of the thin wall you made [click at the corner with Alt-Shift]. Now type Z and set the Z value to 0.000'. Select your wall, choose Set Vector Fill Origin/ Set Position from the Special Menu. Click on the User Origin in the 3D Window. Do a photorendering and you'll only see the figure shaped shadow. The hardest part of this method is getting the origin set correctly.

The 3D window shows only the upright wall. AltShift-Click the user origin at the bottom corner of the wall. The User Origin appears as a 3-pointed star. The shadow will be of a rectangle. When you have done the business with the Special menu, you can try photorendering. If all went well, you will get this!

Want more? Having got it working with one wall, you can duplicate them as much as you like. Although it first required the user origin, it seems to remember the mapping thereafter, even when you move or duplicate the wall.

If the wall renders unreliably (texture doesn’t lock to the bottom corner), then Save Special... as an Object and it will always work. The Autoscript gives a perfect demonstration of the use of COOR and VERT!

©David NC and Steve Campbell <> with apologies to Dwight Atkinson


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Cast Shadows without Alpha Channels and do it with GDL I

N the Discovery course, we had a 3D outline shape that was cut for different people shapes. The same technique can be applied to trees. But it couldn’t display a photographic texture map. In the Voyager exercise on the previous page, we mapped a texture onto a wall. It can cast shadows in a rendering but is a rectangle in 3D. It seems we can only butter our bread on one side. With a bit of GDL we can have our bread both-sidesbuttered! Let’s adapt Geoffroy Magnan’s object, to extend the model of Dwight. Bring the figure into ArchiCAD, resize it with the Figure settings box (in AC 6.5

r3) to the exact size. Make sure the bottom left corner is precisely on the Main Origin of the Project file. Trace it with a Fill tool. Drag it into the floating 2D script window of a new object. It will be a POLY2_B. This can be converted easily into a POLY_ which is a 3D entity. Copy and Paste that into the subroutine of the 3D script of our new object below, set A and B to match width & height, and save as a new object. This technique can be applied very successfully to entire building facades. This object can be adapted. Just trace the outline with a Fill, drag over to the GDL and build the resulting outline in to the subroutine.

Set the size of the figure, and position it over the Main Origin before tracing it. Dont’ make the tracing too elaborate, its only there to cast a shadow. Software like Adobe Str eamline or Coreldraw may be able to do this for you, save as a DXF and bring in to ArchiCAD, and use the magic want to form a Fill. But you may have thousands of points, whereas with hand tracing, it is quick and you end up with a managable 47 points. Before you are finished, knock up a quick 2D script with PROJECT2 3,270,1. See the example on the Cookbook CD. !3D Cutout model without alpha shadows dkx=K~-X~:IF dkx=0 THEN dkx=0.001 dly=L~-Y~ azi=ATN(dly/dkx)!Azimuth DEFINE TEXTURE 'maptxt' filnam, A, B, 1, 0 DEFINE MATERIAL 'mapmat' 24, 0.5,0.5,0.5, 0,61,IND(TEXTURE,'maptxt') PEN pcol MATERIAL 'mapmat' IF turn THEN ROTz (90+azi-W~) ROTX 90 BODY -1:GOSUB 100:BODY -1!Do it! DEL 1 This routine rotates BASE the cutout figure to VERT 0,0,0 !1 origin face the camera VERT 1,0,0 !2 X VERT 0,1,0 !3 Y VERT 0,0,1 !4 Z This routine is COOR 2+256,-1,-2,-3,-4 guaranteed to BODY -1 position the texture at END !-------------------------the object’s origin 100 : !Dwight POLY_ 47, 0.392028, 0.102625, 1, 0.295824, 0.115744, 1, 0.208365, 0.093879, 1, !all the remaining points follow...... RETURN ©Copyright Marmalade 1998, 1999, 2000, 2001

All you have to do now is tell it the name of the file to load as a texture.

The resulting object now works well in 3D as well as in Photorenderings!


The GDL Cookbook 3 – Voyager

Animated Flag O

K, you are thinking this is just a flag. But, read on! This remarkably clever little object is supplied by reader Frank Chin of Brunei, and demonstrates a host of powerful uses of GDL. In particular, it includes: • COONS for making a surface • Using trigonometry to form a wave form • Defining Materials with full details • Defining Texture • Defining location of the texture • User Interface – the full job • Frame based animation Place the zzyzx factor at the top. This disappears, and re-appears in the settings box for the height factor. Make the most important parameter bold.

Value list and Parameter box Build the Parameter box, and write the Value list, into the Parameter script. Base the set of choices on a matching set of bitmap images that you have scanned or painted. Note that the bitmap files have the same names as the choices in the menu. VALUES "FLG" "Belgium", "France", "Lithua", "Norway", "Sa", VALUES "WSPD"

"Arg", "Austl", "Austria", "Canada", "Denmark", "Finland", "Germany","Hungary", "Italy", "Mexico", "Moldova", "Neth", "Nz", "Peru", "Russia", "Switz", "Uk", "Usa", "Venez" "Slow", "Medium", "Fast"

3D Script First build the Flagpole. The radii are a function of the height. Then the country is found from the Value list, setting a small ‘flag’ called coun. Because Frank’s bitmap flag images are all slightly different in size he has a lot of small adjusters of the aspect ratio which are stored in little subroutines at the end. It would reduce the programming workload if the bitmaps were exactly the same width and height. fnu is an arbitrary starting angle for the flag at the start of the animation. The shape of the flag is a SIN-wave form that travels through the flag; the wind speed index will modify the amplitude of the waves. The flag is lifted and rotated into position and its size adjusted according to the aspect ratio. The clever bit that controls animation is based on N_ (GLOB_FRAME_NR), the global variable that is the index of the frame that is viewed during the animation. For a still image, the flag exists in a static wave, but if you have a number of cameras and run an flythrough (with ‘Rebuild each Frame’), the flag will appear to wave convincingly. 2.156

!Flag created by Frank Chin !November, 2000 !Flag Pole fpht=zzyzx RESOL 12 MATERIAL mtl CONE fpht,fpht*0.0075,fpht*0.0025,90,90 ADDZ fpht SPHERE fpht*0.0065 DEL 1 !Flag selection IF flg="Arg" THEN coun=1 IF flg="Austl" THEN coun=2 IF flg="Austria" THEN coun=1 IF flg="Belgium" THEN coun=3 IF flg="Canada" THEN coun=2 IF flg="Denmark" THEN coun=4 IF flg="Finland" THEN coun=5 IF flg="France" THEN coun=1 IF flg="Germany" THEN coun=6 IF flg="Hungary" THEN coun=1 IF flg="Italy" THEN coun=1 IF flg="Lithua" THEN coun=2 IF flg="Mexico" THEN coun=1 IF flg="Moldova" THEN coun=7 IF flg="Neth" THEN coun=1 IF flg="Norway" THEN coun=8 IF flg="Nz" THEN coun=2 IF flg="Peru" THEN coun=1 IF flg="Russia" THEN coun=1 IF flg="Sa" THEN coun=1 IF flg="Switz" THEN coun=9 IF flg="Uk" THEN coun=2 IF flg="Usa" THEN coun=10 IF flg="Venez" THEN coun=1 GOSUB coun*10 !Organise parameters fnu=coun*2 !Starting angle for SIN wave !Wind Speed Selection IF wspd="Slow" THEN spd=0.75 IF wspd="Medium" THEN spd=1 IF wspd="Fast" THEN spd=1.5 These !Get ready to rumble! commands lift ratflg=szx/szy ADDZ fpht-0.6*flgL/ratflg and rotate the ADDX 1.1*flgL/2 flag into MUL flgL/2,flgL/2*spd,flgL/ratflg position and flgx=ratx/szx*flgL adjust its size flgy=raty/szy*flgL/ratflg ROTX 90 q=(N_+fnu)*40 !Animation index DEFINE TEXTURE "FLAG-MAP" flg, flgx, flgy, 1,0 DEFINE MATERIAL "Flag1" 20, 1, 1, 1, ! surface RGB [0.0 .. 1.0] ! ambient, diffuse, specular, ! transparent coefficients [0.0 .. 1.0] 1, 1, 1, 0, 0, !shining [0.0 .. 100.0] 0, !transparency attenuation[0.0..4.0] 0, 0, 0, !specular RGB [0.0 .. 1.0] 0, 0, 0, !emission RGB [0.0 .. 1.0] 0, !emission attenuation [0.0 .. 65.5] ! Fill index, color index, texture index ! IND(FILL, "Solid Fill") 0, 61, IND(TEXTURE, "FLAG-MAP")

©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Defining Texture and Material The material for the flag is based on a full DEFINE MATERIAL statement, including the use of a Texture. However, the texture does not yet exist – so we must make one. When you make a new material in the options menu, you may have experimented with defining the size and the rotated angle of the texture. This DEFINE TEXTURE command is doing the same thing in a single line of code. It deserves a dip into the GDL reference manual to confirm. There are several way of defining Material, and method 20 is by far the most complex, but there is a good example in the manual that can be copied and adapted.

Build a COONS based flag The flag is defined by its perimeter. The SIN waves travel from the flag post outwards, and GDL calculates a smoothing algorithm for the internal faces. The surface is broken into triangles as shown, and although the grid looks a bit coarse, it looks perfectly smooth once you apply a texture and apply smoothing in the photorender. Frank has made the origin at the centre of the flag, but I would have made it from the upper corner nearest to the top of the flagpole. The flag is built flat on the floor. The outline of the flag has been traced in the floor plan with a slab, and those XY coordinates have been brought into GDL as a cPRISM_. The masking codes have been stripped off and the XYs have had a Z factor added. The Z is based on the SIN wave; the q-factor (animation index) modifies the height at each point. The SIN wave is also applied to the vertical edges of the flag. Check earlier in the Cookbook for the sequence of building a COONS. To remind you, you build a list of the XYZ locations in sequential order from the corner points 1 to 2, 4 to 3, 1 to 4 and 2 to 3. If you use PUT & GET, the job is made easier. Precede the COONS with a BODY -1 command. This is always a good idea, but if you are going to map a texture on to it, it is essential!

Comment: Instead of click-click tracing out the flag outline on plan, I would have defined the planshape as a mathematically defined parallelogram, drooping more as the windspeed dropped. ©Copyright Marmalade 1998, 1999, 2000, 2001

BODY -1 MATERIAL 'Flag1' !1>2 PUT -1.049971, -0.530855, -0.771689, -0.501782, -0.530451, -0.477571, -0.257369, -0.477571, 0.002391, -0.500883, 0.278803, -0.500883, 0.558544, -0.514204, 0.828295, -0.537516, 1.078065, -0.570818, !4>3 PUT -1.009465, 0.497912, -0.758049, 0.513212, -0.521268, 0.508426, -0.250387, 0.487386, -0.009750, 0.471607, 0.250612, 0.483442, 0.499139, 0.499221, 0.755893, 0.472164, 0.937848, 0.429705,

SIN(q+200)*0.1*0.3, SIN(q+160)*0.1*0.4, SIN(q+120)*0.1*0.5, SIN(q+80)*0.1*0.6, SIN(q+40)*0.1*0.8, SIN(q+0)*0.1*1, SIN(q-40)*0.1*1.2, SIN(q-80)*0.1*1.4, SIN(q-120)*0.1*1.9 SIN(q+360)*0.1*0, SIN(q+320)*0.1*0.2, SIN(q+280)*0.1*0.4, SIN(q+240)*0.1*0.6, SIN(q+200)*0.1*0.8, SIN(q+160)*0.1*1, SIN(q+120)*0.1*1.2, SIN(q+80)*0.1*1.4, SIN(q+40)*0.1*1.6

!1>4 PUT -1.049971, -0.530855, SIN(q+200)*0.1*0.3, -0.983366, -0.274425, SIN(q+240)*0.1*0.4, -0.960054, 0.005317, SIN(q+280)*0.1*0.4, -0.980189, 0.250694, SIN(q+320)*0.1*0.2, -1.009465, 0.497912, SIN(q+360)*0.1*0 !2>3 PUT 1.078065, -0.570818, SIN(q-120)*0.1*1.9, 1.011460, -0.274425, SIN(q-80)*0.1*1.6, 1.001469, -0.037977, SIN(q-40)*0.1*1.6, 0.978772, 0.221673, SIN(q+0)*0.1*1.6, 0.937848, 0.429705, SIN(q+40)*0.1*1.6 COONS 9,5,63,GET(NSP) BASE VERT -1.50, -0.75, 0 !origin for texture VERT 1.50, -0.75, 0 !x-direction VERT -1.50, 0.75, 0 !y-direction VERT -1.50, -0.75, 1 !z-direction COOR 2+256, 1, 2, 3, 4 BODY -1 Wrapping mode here is ‘box’ DEL 4 END:!_____________________________ 10: szx=2.25:szy=1.5 ratx=3.38:raty=2.25 RETURN 20: szx=2.6:szy=1.3 ratx=3.9:raty=1.95 RETURN 30: szx=1.98:szy=1.71 ratx=2.97:raty=2.57 RETURN 40: szx=2.12:szy=1.6 ratx=3.18:raty=2.4 RETURN 50: szx=2.35:szy=1.44 ratx=3.53:raty=2.16 RETURN

60: szx=2.37:szy=1.43 ratx=3.56:raty=2.15 RETURN 70: szx=1.4:szy=0.7 ratx=2.1:raty=1.05 RETURN 80: szx=2.16:szy=1.57 ratx=3.24:raty=2.36 RETURN 90: szx=1.84:szy=1.84 ratx=2.76:raty=2.76 RETURN 100: szx=2.53:szy=1.34 ratx=3.80:raty=2.01 RETURN

Mapping the Texture Start with BASE to reset counters. Now define the four vertices that define where the texture will go. Vert1 states the origin (bottom left) of the texture, and from that, Vert2 and Vert3 define the direction towards X and Y; that defines the flat plane of the texture. The Vert4 points to the Z direction, perpendicular to the texture; in this case the wrapping mode for the texture is ‘box’ which is applied to both sides of the flag surface. The COOR command finally applies the texture: 2 is for ‘box’ and 256 makes it start from VERT1. Round off the whole procedure with a BODY -1. 2.157

The GDL Cookbook 3 – Voyager

User Interface for the Flag There can be few candidates more suitable for a visual User interface than a bunch of national flags! The tiled image of flags is 280x560 which makes it easy to break into 3 wide and 8 rows. The names in the index list must exactly match the names of the flag files and the Value list. In this case, with only a few parameters, the whole object can be presented in a user interface box, but you need to juggle the font and infield box sizes to make everything fit snugly!

UI_DIALOG "Country Flag" UI_INFIELD 'FLG',6,16,298,166, 1,'flags_all_ui.jpg',24,8, 92,80,90,60, 1,"Arg", 2,"Austl", 3,"Austria", 4,"Belgium", 5,"Canada", 6,"Denmark", 7,"Finland", 8,"France", 9,"Germany", 10,"Hungary", 11,"Italy", 12,"Lithua", 13,"Mexico", 14,"Moldova", 15,"Neth", 16,"Norway", 17,"Nz", 18,"Peru", 19,"Russia", 20,"Sa", 21,"Switz", 22,"Uk", 23,"Usa", 24,"Venez" UI_STYLE 2,0 UI_OUTFIELD 'International',4,210,100,25 UI_OUTFIELD 'Flag pole',4,226,100,25 UI_STYLE 1,0 UI_OUTFIELD 'Copyright Frank Chin',4,244,100,12 UI_SEPARATOR 106,186,106,262 UI_STYLE 0,0 UI_OUTFIELD 'Height of Pole',110,190,78,16 UI_OUTFIELD 'Length of flag',110,208,78,16 UI_OUTFIELD 'Pole Material',110,226,78,16 UI_OUTFIELD 'Wind Speed',110,244,78,16 UI_INFIELD 'zzyzx',200,186,102,14 UI_INFIELD 'FLGL',200,208,102,14 UI_INFIELD 'MTL',202,226,98,18 UI_INFIELD 'WSPD',200,244,100,18

©Copyright Frank Chin and David Nicholson-Cole

Bendy Bar!

Reinforced Concrete assistant


ENDYBAR is an object that can be put to many uses, but its primary use is as reinforcement in concrete. It can be used for drainage and plumbing, or for neon lettering. It consists of a bar that can be bent in six ways, with any degree of curvature, bending angle and twisting angle at each bend. It is a useful exercise in demonstrating the simple but effective use of ARRAYS, and of making that array visible to the user. It makes what is a complex object vastly more user friendly.

You have to click on this button to make the parameter adopt the form of an Array !Values List Script VALUES 'shape' '1_Single bar', '2_Two-bar','3_Three-bar','4_Four-bar', '5_Five-bar','6_Six-bar','7_Seven-bar'

The array is now visible to the user, who can enter data for the bar, such as twist angle, length and sweep with little difficulty.


Value Lists are the way to make objects very user friendly. This one is easier to parse because each one starts with a numerical digit, making it possible to use the SPLIT command to extract the flag. It only takes a simple “%n” to extract that vital digit. ©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager

Master Script

!Bendibar- Reinforcing bars

!Parameter checks

brad=diam/2000 !Bar radius The primary job is to parse the !Master Script Value List. I have shown two DIM leng[7],crad[6],twist[6],bend[6] br=brad*1.5 FOR k=1 TO shp-1 methods of doing it. The pa- !This is the long hard IF crad[k]<brad THEN rameter checks build in a !way to parse a value list crad[k]=brad IF shape='1_Single bar' THEN shp=1 IF bend[k]<0 THEN number of safeguards, in case IF shape='2_Two-bar' THEN shp=2 twist[k]=twist[k]+180 of problems such as the curve IF shape='3_Three-bar' THEN shp=3 bend[k]=ABS(bend[k]) radius being smaller than the IF shape='4_Four-bar' THEN shp=4 ENDIF IF shape='5_Five-bar' THEN shp=5 IF leng[k]<0 THEN leng[k]=0 tube radius. I usually write the IF shape='6_Six-bar' THEN shp=6 NEXT k object first, get it working, then IF shape='7_Seven-bar' THEN shp=7 IF leng[shp]<0 THEN leng[6]=0 discover the things that can !If all you want is a flag upset it with user-abuse, and !then use SPLIT() instead n=SPLIT(shape,"%n",shp) write in safeguard routines to This Routine parses the Value List to work out This routine does some error checking – catch the snags.

3D Script

the user’s requirements. These can be converted converting to metres, looking for minus to a number. You can either use a series of IF quantities and other user errors. statements, or a single SPLIT command can extract the right figures in a single hit.

Because this uses arrays, the final 3D routine is incredibly short. The FOR... NEXT loop does all the work and the value of ‘k’ in each run through the loop decides which section of the rod and which bend will be created. I tend to get one run of it working, and then a second. Once that is proven, you can increase the size of the loop. An engineer advised me that 6 or 7 bends in a reinforcing bar would be as many as you could want. But for something like neon lettering, there is a case for making the total number even larger. The routine follows a similar idea to that used in the first Handrail in the Discovery course – simple really. The twist added to the bar routine adds 3 dimensional quality to the bar.

2D Script This tool could be bent into such wierd shapes that it is not practical to work out a 2D script for it. You will have to depend on PROJECT2 for the 2D. However, as a bunch of these bars could get mighty confusing, it helps a great deal to write a script to place cross hairs at the start of the tool, and to a starting Hotspot. It might help to remove Hotspots on the Bounding box, as these could become a dense forest of hotspots when you built a reinforcement cage.

!Bendibar- Reinforcing bars !3D Script MATERIAL bmat PEN pcol RADIUS brad,brad*2 ROTx rottx ROTy rotty CYLIND leng[1],brad FOR k=1 TO shp-1 ADDz leng[k] ROTz twist[k] ELBOW crad[k],bend[k],brad ADDx crad[k] ROTy bend[k] ADDx -crad[k] CYLIND leng[k+1],brad NEXT k DEL 5*(shp-1) DEL 2 !Remove ROTs END:!----------------------!2D Script PEN pcol HOTSPOT2 0,0 PROJECT2 3,270,2 !Cross hair at start LINE2 br,0,-br,0 LINE2 0,br,0,-br ARC2 0,0,brad,60,120 ARC2 0,0,brad,150,210 ARC2 0,0,brad,240,300 ARC2 0,0,brad,330,390

With a bit of work, you can build up complex cages like this; the bars get easier and easier to imagine and manipulate with more practice.

©Copyright Marmalade 1998, 1999, 2000, 2001


The GDL Cookbook 3 – Voyager

Curvy Roof T

HIS LOOKS very complex at first sight – but if you are a true Voyager, you will have a go at trying something like it. The exercise includes: • Arrays, to store locations • COONS: form a surface from a profile • TUBE: form a gutter following a complex path • EXTRUDE and POLY from an array • PUT & GET as if it was going out of fashion! The first version of this was written by one of my students, Alfred Man in AC 5.1, and was part of a model we did for part of the roof of an office refurbishment scheme in North Notts. I have extensively updated it for AC 6.X. This is a solid that could not be created by any of the solids in the GDL vocabulary – so it must be built from a series of Surfaces for top, sides and bottom, made by GDL. Because they are all repeating the same set of XY locations, use Arrays.

Procedure First a hand drawn drawing of the required roof was scanned in greyscale – then pulled into ArchiCAD. A Fill is clicked around the outline, making sure the clicks coincide with roofing welts. The Fill is dragged into the 2D script window of a new object, as a POLY2B. The XY list from the fill is dragged into the Master Script (then the rest of the fill thrown away). This seems like a cheat, but it’s a very laboursaving way to get XY locations established and more accurately than any other method. If you make the Fill to site on the main origin, then you get a nice clean set of coordinates (without an offset to consider.)

Master Script The idea is to PUT all the XY points (and the point status code) from the Fill into memory, then to flow them into Arrays for X and for Y, discarding the status codes along the way; then to identify the middle and end points, to help build our COONs and other shapes. Before you build the array, you have to use the DIM command to prepare for the array to be filled – use a number that is Equal to or Larger than the number you intend to put in there. We have 38 points, so a round number of 50 will do for now. Then a For.. Next Loop does the hard work.

Parameters The size on plan is determined by the Fill, so A and B are not used, but Heights are parametric, as are the Materials and Gutter details.

!Name:Curvy Roof !Master Script !Raw Data for points !Stolen from a POLY2B (Fill) PUT 0.0, 0.0, 1, !pt 1 0.350873, 0.0, 1, 0.589629, 0.057864, 1, 0.851114, 0.158436, 1, 1.092485, 0.299235, 1, 1.273514, 0.480264, 1, 1.434428, 0.661292, 1, 1.555114, 0.822206, 1, 1.675799, 1.023349, 1, 1.765522, 1.247996, 1, 1.778437, 1.421734, 1, 1.789253, 1.611861, 1, 1.789253, 1.785883, 1, 1.789253, 1.991546, 1, 1.789253, 2.213029, 1, 1.789253, 2.347501, 1, 1.789253, 2.529433, 1, 1.789253, 2.735096, 1, 1.789253, 3.042829, 1,!pt 2 5.665204, 3.042829, 1,!pt 3 5.665204, 2.236759, 1, 5.665204, 1.690962, 1, 5.665204, 1.010693, 1, 5.665204, 0.354154, 1, 5.665204,-0.262834, 1, 5.665204,-0.927283, 1, 5.665204,-1.512631, 1, 5.665204,-2.153349, 1, 5.586103,-2.738697, 1, 5.245969,-3.284494, 1, 4.668531,-3.648359, 1, 4.027812,-3.759101, 1, 3.355453,-3.759101, 1, 2.714735,-3.759101, 1, 2.035076,-3.759101, 1, 1.377927,-3.759101, 1, 0.737209,-3.759101, 1, 0.0, -3.759101, -1 !pt 4 !Defining the array DIM x[50],y[50] FOR k = 1 to 38 x[k]=GET(1) y[k]=GET(1) nul=GET(1) !throw away all 1’s NEXT k p1=1 p2=19 p3=20 p4=38

!Array !Array !Array !Array

index index index index

of of of of

Point Point Point Point

1 2 3 4

3D Script First the main roof surface roof is to be made with a COONS mesh. For this it is important that the number of points along the ridge and the eaves are the same. Then a number of roofing welts are to be drawn that join the eaves to the verge (using TUBE). Then the vertical wall along the ridge, using EXTRUDE. Then, the same technique to do the fascia. Finally, a gutter section (defined by TUBE) must follow the eaves fascia around the curve. Note that TUBE needs phantom points before start and after the end of each section.


©Copyright Marmalade 1998, 1999, 2000, 2001

The GDL Cookbook 3 – Voyager !Curvy Roof !first written:AlfMan Sept98 !totally rewritten Jan2000 !by DNC PEN L_ !Array is in the Master Script !Drawing the roof MATERIAL rmat !Data for Roof Coons !1 to 2 FOR k = p1 to p2 PUT x[k],y[k],hit2 NEXT k !4 to 3 FOR k = p4 to p3 step -1 PUT x[k],y[k],hit1 NEXT k !1 to 4 PUT x[p1],y[p1],hit2 PUT x[p4],y[p4],hit1

The 1-2-3-4 numbering convention for the COONs is shown in the 2D display. See the pages on making COONs and the Catamaran exercise. Those exercises used real values for the COONS, these ones get the values from the Array, and PUT them into memory.

!2 to 3 PUT x[p2],y[p2],hit2 PUT x[p3],y[p3],hit1 COONS 19,2,63, GET(NSP) !Drawing the end fascia MATERIAL wmat PLANE 4, x[p1],y[p1],0, !Point 1 x[p1],y[p1],hit2, ! x[p4],y[p4],hit1, ! x[p4],y[p4],0 !Point 4 !Drawing the other end fascia PLANE 4, x[p2],y[p2],0, !Point 2 x[p2],y[p2],hit2, ! x[p3],y[p3],hit1, ! x[p3],y[p3],0 !Point 3

All of these forms are made by plucking out the appropriate numbers from the Array that was built in the Master Script

!Drawing the inside curve MATERIAL wmat FOR k=p1 TO p2 PUT x[k],y[k],1 NEXT k EXTRUDE NSP/3,0,0,hit2,0, GET(NSP) !Drawing the outside curve MATERIAL wmat FOR k=p3 TO p4 PUT x[k],y[k],1 NEXT k EXTRUDE NSP/3,0,0,hit1,0, GET(NSP) !Drawing the Ceiling MATERIAL cmat FOR k=p1 TO p4 PUT x[k],y[k] NEXT k POLY NSP/2, GET(NSP) !Drawing the roofing welts MATERIAL rmat FOR k = p1 to p2 PUT 0,0,1000,0 !1st Phantom Point PUT x[k],y[k],hit2,0 PUT x[p4+1-k],y[p4+1-k],hit1,0 PUT 0,0,-1000,0 !last Phantom Pt NEXT k ©Copyright Marmalade 1998, 1999, 2000, 2001

numb = NSP/16 FOR K=1 TO numb TUBE 5,2+2,63, -0.03,0.00,0, !Sectionpoints -0.03,0.05,0, 0.03,0.05,0, 0.03,0.00,0, -0.03,0.00,0, GET(16) !Pathpoints NEXT k !Drawing the gutter MATERIAL gmat !Pathpoints PUT x[p4]-0.01,y[p4],0,0!1st Phant.Pt FOR k = p4 to p3 STEP -1 PUT x[k],y[k],0,0 NEXT k PUT x[p3],y[p3]+0.01,0,0!Last Phant.Pt ADDz galt BODY -1 TUBE 9,NSP/4,63, 0, 0,0, !Sectionpoints 0, ghit,0, -gthk,ghit,0, -gthk,gthk,0, -gdep+gthk,gthk,0, -gdep+gthk,ghit,0, -gdep,ghit,0, -gdep,0, 0, 0, 0, 0, GET(NSP) !Pathpoints BODY -1 DEL 1

2D Script is used here to place Hotspots at all the welt ends, and to illustrate the numbering convention for the COONS that forms the roof surface. Project 2 is used to form the roof because there are only 2 on the building, but for hardened GDL users with more space than I have on the page, it’s easy to write a POLY2 routine for the outline and some LINE2 routines for the welts, using the same techniques as in the 3d script.

Comment Why doesn’t this use Subroutines? Well, there are no cursor movements until the Gutter – all commands use precise XYZ locations. Therefore each routine is tidily modular already. !Curvy Roof !2D Script HOTSPOT2 0,0 PROJECT2 3,270,2 FOR k=p1 TO p4 HOTSPOT2 x[k],y[k] NEXT k IF shonum THEN DEFINE STYLE 'CR_txt' 'Arial', 2*gdep*1000/A_,3,1 SET STYLE 'CR_txt' TEXT2 x[p1],y[p1],1 TEXT2 x[p2],y[p2],2 TEXT2 x[p3],y[p3],3 TEXT2 x[p4],y[p4],4 ENDIF


The GDL Cookbook 3 – Voyager Flat area caused by MASS connecting points unexpectedly

3D View: Here is the finished solid looking roof, built from 6 surfa