将覆盖率与道路和边界距离联系起来的规则

引用于 UrbanEngine 在 2025年4月2日, 下午8:23您好,
根据标题,我正在尝试创建一条规则,将地块的覆盖率与道路和边界的距离联系起来。首先,我要说我是 cityengine 的新手。
我已经研究这条规则两周了,阅读了几篇文章,关注了几个 youtube 视频。我设法创建了一条规则,将 notto 分为 5 个部分。
建筑物突出的中央部分和另外 4 个自由部分。我将地块分成所有这些部分,以便我可以调整到边界和道路的距离并控制建筑物表面。
只是有一个问题。控制并不完美,事实上,为了能够改变距离,我必须对不同地块的面积百分比采取行动。这很不方便,因为它不允许我直接对距离采取行动。
作为初学者,我想知道是否有办法实现这个结果。
提前致谢
您好,
根据标题,我正在尝试创建一条规则,将地块的覆盖率与道路和边界的距离联系起来。首先,我要说我是 cityengine 的新手。
我已经研究这条规则两周了,阅读了几篇文章,关注了几个 youtube 视频。我设法创建了一条规则,将 notto 分为 5 个部分。
建筑物突出的中央部分和另外 4 个自由部分。我将地块分成所有这些部分,以便我可以调整到边界和道路的距离并控制建筑物表面。
只是有一个问题。控制并不完美,事实上,为了能够改变距离,我必须对不同地块的面积百分比采取行动。这很不方便,因为它不允许我直接对距离采取行动。
作为初学者,我想知道是否有办法实现这个结果。
提前致谢

引用于 UrbanEngine 在 2025年4月2日, 下午8:23你好 @Neri12 ,
欢迎加入 ArcGIS CityEngine 社区。
为了给您提供建议,提供一张屏幕截图和一些 CGA 代码片段将非常有帮助。一般信息:
- setbackToArea 操作允许 您定义地块的建筑面积与空闲部分的比例。
- setbackPerEdge 操作允许 您定义每个边缘的后退距离。
你好 @Neri12 ,
欢迎加入 ArcGIS CityEngine 社区。
为了给您提供建议,提供一张屏幕截图和一些 CGA 代码片段将非常有帮助。
一般信息:
- setbackToArea 操作允许 您定义地块的建筑面积与空闲部分的比例。
- setbackPerEdge 操作允许 您定义每个边缘的后退距离。

引用于 UrbanEngine 在 2025年4月2日, 下午8:24例如,您可以先使用 计算边缘属性工具获取地块形状的方向。然后,以下规则允许您定义最大建筑物覆盖率和每侧的后退距离。如果最大覆盖率小于setbackPerEdge操作的其余部分,则前部后退将通过setbackToArea操作增加(深蓝色区域)。
version "2024.1" const lotArea = geometry.area @Description("Maximum ratio of footprint to parcel area") @Percent attr area_ratio = 0.5 @Description("Minimum street setback") @Distance @Range(min=0, max=15) attr setback_front = 5 @Description("Excact side setback") @Distance @Range(min=0, max=15) attr setback_side = 10 @Description("Excact rear setback") @Distance @Range(min=0, max=15) attr setback_rear = 15 dist(orientation) = case orientation == "front" : setback_front case orientation == "side" : setback_side case orientation == "rear" : setback_rear else : 0 @StartRule SetbackPerEdge --> setbackPerEdge( dist( edgeAttr.getString("orientations") ) ) { edgeAttr.getString("orientations") == "front" = Grey | edgeAttr.getString("orientations") == "side" = Yellow | edgeAttr.getString("orientations") == "rear" = Green | remainder = SetbackToArea } SetbackToArea --> setbackToArea(lotArea * area_ratio) { edgeAttr.getString("orientations") == "front" = Blue | remainder = extrude(10) Cyan }
例如,您可以先使用 计算边缘属性工具获取地块形状的方向。然后,以下规则允许您定义最大建筑物覆盖率和每侧的后退距离。如果最大覆盖率小于setbackPerEdge操作的其余部分,则前部后退将通过setbackToArea操作增加(深蓝色区域)。
version "2024.1"
const lotArea = geometry.area
@Description("Maximum ratio of footprint to parcel area") @Percent
attr area_ratio = 0.5
@Description("Minimum street setback") @Distance @Range(min=0, max=15)
attr setback_front = 5
@Description("Excact side setback") @Distance @Range(min=0, max=15)
attr setback_side = 10
@Description("Excact rear setback") @Distance @Range(min=0, max=15)
attr setback_rear = 15
dist(orientation) = case orientation == "front" : setback_front
case orientation == "side" : setback_side
case orientation == "rear" : setback_rear
else : 0
@StartRule
SetbackPerEdge --> setbackPerEdge( dist( edgeAttr.getString("orientations") ) )
{ edgeAttr.getString("orientations") == "front" = Grey
| edgeAttr.getString("orientations") == "side" = Yellow
| edgeAttr.getString("orientations") == "rear" = Green
| remainder = SetbackToArea }
SetbackToArea --> setbackToArea(lotArea * area_ratio)
{ edgeAttr.getString("orientations") == "front" = Blue
| remainder = extrude(10) Cyan }

引用于 UrbanEngine 在 2025年4月2日, 下午8:24你好,谢谢你的回复。
我尝试了你的规则。但它很有效。老实说,我不知道为什么。无论如何,我设法使用函数setbackToArea( area, minDistances )来解决这个问题,只是我不得不妥协,比如优先考虑的不是覆盖率而不是距离。为了解决这个问题,我在规则中创建了一个报告,向我展示了实际的覆盖率,这样我就可以手动操作来获得我想要的覆盖率。
现在我不知道是否有更精细的方法来实现相同的结果。如果你知道,我可以尝试一下。
但是现在我产生了一个额外的问题,实际上我需要设置边界和道路必要距离的限制,基本上距离需要根据效率的高度而改变,并且如果有的话需要能够消除一个边界与另一个边界之间的距离。
为了更好地解释,我选择需要让距离调整到我的高度,这是通过设置属性来实现的。一切顺利,我发现的问题是,我希望距离在右边创建取消,在左边达到最大。以便在边界处建筑物。
我实际上已经允许尝试使用@Enum函数和@Range函数,但两者都无法满足我的需求。晚上给出了一个范围,而首先我确定了预定的数值,我希望@enum函数中的这些数值具有交互性并适合我输入的输入数据,即alt。
我希望我已经表达清楚了。
再次感谢社区的欢迎,我希望能够使用 cityengine 创建自己的程序规则。
你好,谢谢你的回复。
我尝试了你的规则。但它很有效。老实说,我不知道为什么。无论如何,我设法使用函数setbackToArea( area, minDistances )来解决这个问题,只是我不得不妥协,比如优先考虑的不是覆盖率而不是距离。为了解决这个问题,我在规则中创建了一个报告,向我展示了实际的覆盖率,这样我就可以手动操作来获得我想要的覆盖率。
现在我不知道是否有更精细的方法来实现相同的结果。如果你知道,我可以尝试一下。
但是现在我产生了一个额外的问题,实际上我需要设置边界和道路必要距离的限制,基本上距离需要根据效率的高度而改变,并且如果有的话需要能够消除一个边界与另一个边界之间的距离。
为了更好地解释,我选择需要让距离调整到我的高度,这是通过设置属性来实现的。一切顺利,我发现的问题是,我希望距离在右边创建取消,在左边达到最大。以便在边界处建筑物。
我实际上已经允许尝试使用@Enum函数和@Range函数,但两者都无法满足我的需求。晚上给出了一个范围,而首先我确定了预定的数值,我希望@enum函数中的这些数值具有交互性并适合我输入的输入数据,即alt。
我希望我已经表达清楚了。
再次感谢社区的欢迎,我希望能够使用 cityengine 创建自己的程序规则。

引用于 UrbanEngine 在 2025年4月2日, 下午8:25感谢您的反馈。很高兴您成功解决了您的问题。
为了使我的示例规则起作用, 地块形状需要计算边缘属性工具设置的 属性edgeattr/ orientations。
感谢您的反馈。很高兴您成功解决了您的问题。
为了使我的示例规则起作用, 地块形状需要计算边缘属性工具设置的 属性edgeattr/ orientations。