Corner depth of imported parcels

05-08-2018 08:23 AM
New Contributor II

I am currently working on 3D zoning and I face 3 issues for which I looked all over the forum, the help documentation and the tutorials and I can't figure out how to solve them. This post is about the second issue - corner depth of imported parcels. Here is a link to the first and a link to the third one.

There is an automatic attribute for the corner width (not depth) for dynamic shapes created from graph network. But in urban design we already have parcels and need to specify the build up area for them. There are cases in which a corner parcel has no setbacks from the streets and an offset / chamfer from the corner must be set along the bisector of the angle. That offset must have a distance of 2 meters from the corner. You can see the attached sketch for more clarity.

I need to be able to set this corner offset and then to extrude the 3D Volume. I set the setbacks in BuildArea rule and I found a way to distinguish the corner lots from the others - Lot rule. In the BuildArea rule I also try to select somehow the corner and then give it a distance but as far as I get is a rectangular shape and not something that I can use. Furthermore, this distance is not along the bisector but along the x and z axes. Would any mix of split, comp and offset operation do the trick?

Here is the CGA code and I attach a screenshot of my work.

attr Front_setback = 5
attr Back_setback = 5
attr Left_setback = 5
attr Right_setback = 5

attr Function = "#ff0000"
attr Opacity = 0.7

attr Eave_height = 0
attr Max_height = 0
attr Roof_angle = 
     case Max_height == Eave_height : 0
     else: 45
attr height = Max_height
attr streetWidth(i) =  0  

BuildArea -->
 setback(Front_setback) { street.front: Lot | remainder: 
  setback(Back_setback) { street.back: Lot | remainder: 
   setback(Left_setback) { street.left: Lot | remainder: 
    setback(Right_setback) { street.right: Lot | remainder:
     split(x){ | 99:split(z){|99:Lot}}                               
Lot -->  
 CornerRecursion(geometry.nVertices - 1, 0)  
CornerRecursion ( edgeID, nStreetEdges ) -->  
 case edgeID >= 0 :  
  case streetWidth(edgeID) > 0 :  
   CornerRecursion ( edgeID - 1, nStreetEdges + 1 )  
   CornerRecursion ( edgeID - 1, nStreetEdges )     
  case nStreetEdges >= 2 :  

IsCornerLot -->  
IsNotCornerLot -->  

BuildVolume -->
     envelope(world.up, Max_height, Eave_height, Roof_angle, Eave_height, Roof_angle, Eave_height, Roof_angle, Eave_height, Roof_angle)
     set(material.opacity, Opacity)
0 Kudos
3 Replies
Occasional Contributor III

Diagonal length / sqrt(2) equals a square's width. So you could align the scope to the geometry, split in x-direction, then split that part again to get a square, then rotate the scope by 45 degrees and do a third split, this time in the middle.

0 Kudos
New Contributor II

Thanks for the answer but I'm not sure how this would help. Most of the shapes are not squares or right angle rectangles so the angle bisector would not overlap with the diagonal and I need the bisector. Even in these very rare cases, the side is always shorter than the diagonal, so when rotated the square is not reaching the opposite vertex. Than I need to scale s() it but it is never as precise as it needs to be, the shape is not connected to the vertex but nearly adjusted and this is something that is different for every shape and is far from automated process. See attached screenshot. Then the issue with the extruded shapes is still on because of the broken down shape tree. You can see from the second screenshot that it is not one volume but three separate. In the main post I attached another screenshots of what actually needs to be prepared as functionality. Would anything else be of help?

0 Kudos
Esri Regular Contributor

If you can't assume rectangular geometry and do what L R suggested, then I'm afraid there isn't an easy way to get this information (the angles between edges).

0 Kudos