Fun with Quarter Circles - Rounded Squares

191
0
01-03-2020 01:16 PM
BrianWamsley
Occasional Contributor II
0 0 191

#CityEngine #quarterCircle #roundedSquares #CGA #roundedBuildings

Once again, I'm a new CityEngine user and didn't see anything describing these findings so I'm going to share:

Taking my "quarter circle" (32 sided disc) studies a step further, I developed CGA for a footprint with four 90 degree corners.  I don't know if I did the best coding ever (more on that) but I got the result I intended in the end.  The code works on squares, rectangles and even circles(?).  But not on oddly angled rectangles or triangles (see bottom and bottom left).  I think this code would work well inside of another "grided" code (x and z splits so that it's all very "sqaure").

To create these shapes I used the primitiveDisc splits as described in my first post.  But each corner gave me some problems so I separated them individually "Z1,Z2,Z3,Z4" and tweaked any translation/pivot issues individually.

Rounded corners on various footprint shapes

/**
* File: FourBldgCorners.cga
* Created: 17 Dec 2019 20:40:03 GMT
* Author: bwamsley
*/

version "2019.1"

///////////////
##Attributes
@Range(min=1,max=100, restricted = false)
attr CornerBendRadius = 20
@Range(min=1,max=100, restricted = false)
attr BuildingH = 20
@Range(min=1,max=100, restricted = false)
attr CornerH = 20

################################
@Start

Footprint-->
alignScopeToGeometry(yUp,0,0)
FootprintSplit

FootprintSplit-->
split(x){CornerBendRadius: CornerBendX1
|~1 : BuildingWidth
|CornerBendRadius: CornerBendX2}

CornerBendX1-->
split(z){CornerBendRadius: CornerBendZ1
|~1 : BuildingWidth
|CornerBendRadius: CornerBendZ2}

CornerBendX2-->
split(z){CornerBendRadius: CornerBendZ3
|~1 : BuildingWidth
|CornerBendRadius: CornerBendZ4}

/////CornerZ1 (DARK BLUE)
CornerBendZ1-->
primitiveDisk(32)
CircleZ1

CircleZ1-->
color(0,0,1)
split(x){'.5 : halfCircleZ1
|'.5 : NIL}

halfCircleZ1-->
split(z){'.5 : quarterCircle1
|'.5 : NIL}

quarterCircle1-->
setPivot(xyz,2)
t(-(CornerBendRadius/2),0,-(CornerBendRadius/2))
s(CornerBendRadius,0,CornerBendRadius)
BuildingCurve

/////CornerZ2 (TEAL)

CornerBendZ2-->
primitiveDisk(32)
CircleB

CircleB-->
color(0,1,1)
split(x){'.5 : halfCircleZ2
|'.5 : NIL}

halfCircleZ2-->
split(z){'.5 : NIL
|'.5 : quarterCircle2}

quarterCircle2-->
setPivot(xyz,1)
t(-(CornerBendRadius/2),0,-(CornerBendRadius/2))
s(CornerBendRadius,0,CornerBendRadius)
BuildingCurve

/////CornerZ3 (RED)

CornerBendZ3-->
primitiveDisk(32)
CircleC

CircleC-->
color(2,0,0)
split(x){'.5 : NIL
|'.5 : halfCircleZ3}

halfCircleZ3-->
split(z){'.5 : quarterCircle3
|'.5 : NIL}

quarterCircle3-->
setPivot(xyz,3)
t(-(CornerBendRadius/2),0,-(CornerBendRadius/2))
s(CornerBendRadius,0,CornerBendRadius)
BuildingCurve

/////CornerZ4 (PURPLE)

CornerBendZ4-->
primitiveDisk(32)
CircleD

CircleD-->
color(1,0,1)
split(x){'.5 : NIL
|'.5 : halfCircleZ4}

halfCircleZ4-->
split(z){'.5 : NIL
|'.5 : quarterCircle4}

quarterCircle4-->
t(-(CornerBendRadius/2),0,-(CornerBendRadius/2))
s(CornerBendRadius,0,CornerBendRadius)
BuildingCurve

BuildingCurve-->
extrude(CornerH)

BuildingWidth-->
color("#E3CF57")
extrude(BuildingH)

If any one knows of a better way to organize the scopes and pivots to simplify my code, I would be grateful to learn.

Hope this helps some one!!