# My buildings extent are not exactly rectangular (static shapes)

1307
8
08-16-2014 08:11 AM
New Contributor

Hi,

I imported some buildings extent interpreted by CE as static shapes, but they are not perfect rectangles.

So every time I attempt to use a split(x/z) or a comp(f) followed by some t(x,y,z), it is all messed up.

Example using split :

General viewCGA

version "2014.0"

@StartRule

A -->

extrude(6)

B

B -->

split(x){

0.5:P|

~1:M|

0.5:P}

P -->

color("#FF80C0")

M -->

color("#00FF00")

Example using comp(f) :

General viewIssues

The yellow face is the "front" face of the ground floor, translated backward.

On the left it overshoots

On the right it undershoots

I guess my problem is that all my operations are based on the scope of my model, which is rectangular, but my shape, so my model, are not.

What would be the best way to handle this ?

Thank you.

Thibault

Tags (2)
1 Solution

Accepted Solutions
Occasional Contributor III

I see whats happening - your Transformation command `t(0,0,-corridorWidth)`is shifting along the Z-axis of the shape - so straight back, but that "straight back" is not aligned with your object since - like we know - your shape isn't square.

What I have done with the code below is isolated your ground floor - then split off the corridorWidth with a NIL so its gone. The result should be what you are looking for - on the left...

/**

* File:    Thibault-NEW.cga

* Created: 17 Aug 2014 07:08:00 GMT

* Author:  devlavigne

*/

version "2014.0"

attr HEIGHT = 9.5

attr groundFloorHeight = 4

attr floorHeight = 4

attr roofHeight = 1.5

attr groundFloorElevation = 0.20

attr corridorWidth = 2

@StartRule

Building-->

[extrude(groundFloorHeight) LowerMass]

UpperMass

UpperMass-->

t(0,groundFloorHeight,0)

extrude(HEIGHT-groundFloorHeight)

split(y){floorHeight:Floor | roofHeight:Roof}

LowerMass-->

split(y) {groundFloorElevation:GroundFloorElevation | GroundFloorBuilding}

GroundFloorBuilding-->

comp(f){

left:GroundFloorBuildingLeft|

right:GroundFloorBuildingRight|

back:GroundFloorBuildingBack}

color("#FFFF00")

8 Replies
Regular Contributor

A -->

innerRect

Continue.

Check the CGA docs if needed.

Ok ?

Matt

New Contributor

innerRect is a solution, but I would like not to modify the extent of my buildings.

What I am trying to do is maybe not possible, but I'd like to understand how to write a code similar to:

@StartRule

A -->

extrude(5)

split(x){

'0.5:B|

'0.5:C}

and get something like :

Thank you.

Thibault

Occasional Contributor III

In your 2nd example above, what is the shape you are starting with - its a little unclear. It looks like a mirror operation could work, unless your starting from the triangle on the left.

The solution you are looking for might be tweaking the the code in what you are trying to do. I've applied all types of rules to all types of building footprints from GIS data and I can assure you probably none of them were perfectly square.

New Contributor

The second example is maybe a little confusing.

The model (in dark grey) is manually edited, from a 2d shape (extent of a building, totally not rectangular), extruded, then I manually splited each faces to simulate what I am trying to achieve trough CGA.

If you go back to the first example part two, using comp(f), it shows what I am really trying to do.

Using Matt suggestion with "innerRect" solve the over/undershoot issues (see the yellow face) :

but the building doesn't follow the extent any more. And as I have a few of these buildings next to each other, I have gaps in between :

but here I have the under/overshoot issues (it is the first example) :

New Contributor

Here is a simplified (and incomplete but working) version of the CGA code with which I am having trouble :

--

version "2014.0"

attr HEIGHT = 0

attr groundFloorHeight = 4

attr floorHeight = 4

attr roofHeight = 1.5

attr groundFloorElevation = 0.20

attr corridorWidth = 2

@StartRule

Building -->

//innerRect

extrude(HEIGHT)

split(y){

groundFloorHeight:GroundFloor|

floorHeight:Floor|

roofHeight:Roof}

GroundFloor -->

split(y){

groundFloorElevation:GroundFloorElevation|

~1:GroundFloorBuilding}

GroundFloorBuilding -->

comp(f){

left:GroundFloorBuildingLeft|

right:GroundFloorBuildingRight|

back:GroundFloorBuildingBack}

t(0,0,-corridorWidth)

color("#FFFF00")

GroundFloorBuildingLeft -->

split(x){

~1:GroundFloorBuildingSideWall|

corridorWidth:NIL}

GroundFloorBuildingRight -->

split(x){

corridorWidth:NIL|

~1:GroundFloorBuildingSideWall}

--

Resulting model with over/undershoot issues on the yellow face:

Occasional Contributor III

I see whats happening - your Transformation command `t(0,0,-corridorWidth)`is shifting along the Z-axis of the shape - so straight back, but that "straight back" is not aligned with your object since - like we know - your shape isn't square.

What I have done with the code below is isolated your ground floor - then split off the corridorWidth with a NIL so its gone. The result should be what you are looking for - on the left...

/**

* File:    Thibault-NEW.cga

* Created: 17 Aug 2014 07:08:00 GMT

* Author:  devlavigne

*/

version "2014.0"

attr HEIGHT = 9.5

attr groundFloorHeight = 4

attr floorHeight = 4

attr roofHeight = 1.5

attr groundFloorElevation = 0.20

attr corridorWidth = 2

@StartRule

Building-->

[extrude(groundFloorHeight) LowerMass]

UpperMass

UpperMass-->

t(0,groundFloorHeight,0)

extrude(HEIGHT-groundFloorHeight)

split(y){floorHeight:Floor | roofHeight:Roof}

LowerMass-->

split(y) {groundFloorElevation:GroundFloorElevation | GroundFloorBuilding}

GroundFloorBuilding-->

comp(f){

left:GroundFloorBuildingLeft|

right:GroundFloorBuildingRight|

back:GroundFloorBuildingBack}

color("#FFFF00")

New Contributor

Hi Devin,