Wall End Elements
1. General Description
This document is a common description of wall end elements in ArchiCAD. For the implementation of wall ends, the ArchiCAD development chose the generic solution of GDL objects. Hereby a user can possibly create specific objects and the ones included into ArchiCAD Library are easy to alter. See the 2D appearance of some wall ends from the Library to get a vision about the possibilites.
Only the differences from the Building Element subtype are listed here.
|AC_HoleSideMaterial||Boolean||Has the same function as in windows and doors.|
|AC_HoleMaterialCurved||Boolean||Has the same function as in windows and doors.|
|AC_WALL_INTID||Integer||The internal ID of the container wall. This value can be used in listing.|
The length of cut in the wall. The length is measured parallel to the reference line of the wall in the centerline.
|AC_fit_to_wall_height||Boolean||If set the object should fit the full height of the wall. The 3D coordinate system's origin is still at GLOB_ELEVATION height, so the 3D model building should start with ADDZ -GLOB_ELEVATION and the value of WALL_HEIGHT should be used instead of ZZYZX for the object height.|
3. ArchiCAD context
The object coordinate system is set as shown below:
Global variables which describe the wall geometry
|Variable||Description of the meaning of the variable|
|WALL_INCL||Side inclination of trapeze wall, 0 for not inclined walls. Non negative angle in degrees.|
|WALL_THICKNESS||Thickness of the wall at the end where the current object is located.|
|WALL_HEIGHT||Height of the wall.|
Is 0 for non-curved walls and the distance of the curve origin and the object origin for curved walls. Can be positive or negative implicitly.
|WIDO_POSITION||Distance of the object origin from the wall origin. It is used to determine the direction of declination.|
The different geometries are the following:
|0 or 1||= WALL_START_THICKNESS
|0 or 1||= WALL_START_THICKNESS
|0 or 1||= WALL_START_THICKNESS
The function of a typical wall end master script is to determine the container wall geometry. This means to find out which case of the above compositions is the current one.
EPS = 0.001 length = AC_CutWidth ! --- wall geometry --- if abs(WIDO_POSITION) < EPS then onWallBeg = 1 endif wallIncl = WALL_INCL maxWThickn = WALL_START_THICKNESS if maxWThickn < WALL_END_THICKNESS then maxWThickn = WALL_END_THICKNESS if abs(maxWThickn - WALL_THICKNESS) > EPS and SYMB_MIRRORED then wallIncl = -WALL_INCL endif if abs(maxWThickn - WALL_THICKNESS) < EPS and SYMB_MIRRORED then wallIncl = -WALL_INCL endif isCurved = 0 if abs(WIDO_ORIG_DIST) > EPS then isCurved = 1 r0 = abs(WIDO_ORIG_DIST) if WIDO_ORIG_DIST > 0 then alpha = (length / (r0 - WALL_THICKNESS/2)) / PI*180 r0 = r0 - WALL_THICKNESS else alpha = (length / (r0 + WALL_THICKNESS/2)) / PI*180 endif endif
A wall end object has usually three main tasks in 2D: draw the cap/ending, draw the remaining part of the wall and place hotspots.
Draw the End cap
Drawing the cap itself is the simpliest of the whole thing. If the cap consists of rectangles (in a normal straight wall), it can be worthwhile to use the SkinRect makro, because it handles trapeze and curved walls automatically. If the cap joins the composite structure of the wall, attention must be paid to the position of the last core skin - which shapes trapeze in trapeze walls -, it can be the first, the last or an inner skin.
Draw the remaining wall
Drawing a wall part isn't an easy thing to do. The outcome of the script must exactly match the wall - which is generated by the ArchiCAD Wall tool. This wall-part is mostly a rectangle, so the usage of SkinRect macro is highly recommended. For a non-composite wall this can be made pretty simple.
The example shows the creation of the whole missing wall-segment.
fill WALL_FILL call "SkinRect" PARAMETERS startX = 0, startY = 0, endX = AC_CutWidth, endY = WALL_THICKNESS, trapType = 1, innerRadius = innerRadius, incAngle = wallIncl, fillPen = WALL_FILL_PEN, fillBGPen = WALL_FBGD_PEN, startLinePen = WALL_SECT_PEN, startLineCont = 1, bottomLinePen = WALL_SECT_PEN, bottomLineLineType = WALL_LINETYPE, bottomLineCont = 1, topLinePen = WALL_SECT_PEN, topLineLineType = WALL_LINETYPE, topLineCont = 1
In composite walls the following factors must be considered: wall geometry (which side is inclining in a trapeze wall), position of the last core skin, state of the Construction Fills setting in the Display Options dialog (draw line between skins or not). You don't have to care much about display options, if you set correctly the line property of the lines you draw. You can read about this issue in Chapter 4.2 of the GDL Technical Standards.
The four hotspots generated by ArchiCAD may not fulfill all expectations.
For that reason the Resize Wall End macro was developed.
This macro places the following hotspots:
For a more complex wall end object more hotspots may be needed. In the wall ends of the ArchiCAD Library this subroutine is used:
! ===== move the coorinate system to a given X coordinate ===== 1: additionIfMirr = 0 additionNotMirr = 0 if innerRadius > EPS then if onWallBeg < EPS then add2 0, -innerRadius rot2 -(xMoveTo / (innerRadius + WALL_THICKNESS/2)) / PI*180 add2 0, innerRadius else add2 0, innerRadius + WALL_THICKNESS rot2 (xMoveTo / (innerRadius + WALL_THICKNESS/2)) / PI*180 add2 0, -innerRadius - WALL_THICKNESS endif moveStepNum = 3 else if SYMB_MIRRORED then additionIfMirr = xMoveTo * tan(wallIncl) else additionNotMirr = xMoveTo * tan(wallIncl) endif add2 xMoveTo, 0 moveStepNum = 1 endif return
This subroutine moves the coordinate system to a given x position
- even if the wall is curved and this is done by rotation -
and returns additional values for trapeze walls.
When called, the following values have to be set:
onWallBeg - true if the object is at the beginning of the wall,
innerRadius - the inner radius of the curved wall or 0 in straight wall,
xMoveTo - the x position to go to.
The subroutine returns these values:
- addition to the y coordinate as needed,
addition to the y coordinate as needed,
number of steps to delete from the transformation stack when the transformation is no longer needed.
Example of usage:
xMoveTo = thickCap gosub 1 hotspot2 0, additionIfMirr + thickFirst, unID unID = unID + 1 hotspot2 0, additionNotMirr + WALL_THICKNESS - thickSecond, unID unID = unID + 1 del moveStepNum
A wall end object has usually two main tasks in 3D: cut a hole into the wall and generate a body. The hole generation is only needed is the wall end object cuts into the wall.
The 3D coordinate system is set this way:
ArchiCAD doesn't move this coordinate system if the Fit to wall height checkbox (
AC_fit_to_wall_height parameter) is checked, so a typical 3D script begins with the following:
elevation = 0 if AC_fit_to_wall_height > EPS then ZZYZX = WALL_HEIGHT elevation = -GLOB_ELEVATION endif addz elevation
For either the gerenation of the hole and the generation of the body the SkinRect macro can be used.
The bounding hotspots can be generated using the Resize Wall End macro. If more hotspots are needed, you can use a subroutine for the placing very similar to the 2D one:
! ===== move the coorinate system to a given X coordinate ===== 1: additionIfMirr = 0 additionNotMirr = 0 if innerRadius > EPS then if onWallBeg < EPS then addy -innerRadius rotz -(xMoveTo / (innerRadius + WALL_THICKNESS/2)) / PI*180 addy innerRadius else addy innerRadius + WALL_THICKNESS rotz (xMoveTo / (innerRadius + WALL_THICKNESS/2)) / PI*180 addy -innerRadius - WALL_THICKNESS endif moveStepNum = 3 else if SYMB_MIRRORED then additionIfMirr = xMoveTo * tan(wallIncl) else additionNotMirr = xMoveTo * tan(wallIncl) endif addx xMoveTo moveStepNum = 1 endif return