语法
- import id : filePath
- import id ( styleId, … , styleId ) : filePath
- import id : filePath ( attrId, … , attrId )
- import id : filePath ( attrId = expression, … , attrId = expression )
- import id : filePath ( )
- import id : filePath ( extensionId –> operations, … , extensionId –> operations )
参数
- id
导入的规则、属性和函数的唯一前缀。
- filePath – 字符串
CGA 规则文件(例如,“file.cga”)的绝对路径或相对路径。 有关支持的语法的详细信息,请参阅资产搜索。
描述
现有规则文件中的规则、属性和函数可由规则文件通过 import 关键字(语法 1)进行导入。 导入规则文件可将导入规则文件的所有规则、属性和函数的前缀设置为 id。 如果导入的规则文件包含多个样式,则默认导入所有样式并在样式管理器中进行显示。
为了限制导入规则文件中的可用样式,可通过以下方式指定导入样式集:在导入 id 后的括号中枚举导入样式(语法 2)。
默认情况下,导入规则文件中的属性值(例如以下 main.cga 中的 height)将传播到导入的规则文件(例如,structure.cga 中的 height 获取自以下 main.cga 中的 height)。 要禁用此默认行为(例如,由于导入规则文件中的属性名称相同但语义不同,因此不应进行覆盖),可通过在规则文件后进行枚举(语法 3)来保护导入的规则文件中的属性。
不仅可以保护属性,导入规则文件还可以使用表达式重新定义属性(语法 4)来指定新的属性值,其中右侧 expression 在导入规则文件的范围内进行评估。
使用空白括号(语法 5)可保护所有导入属性。 如果在检查器中将导入属性的属性源设置为“规则定义的值”之外的值,将完全禁用该属性的此行为,改为从指定的源获取值。
与属性类似,可以使用一系列操作(语法 6)重新定义规则,其中右侧 operations 在导入规则文件的范围内进行评估。 导入规则文件中重新定义的规则必须是扩展规则。 在 operations 的任何操作中,可以使用当前规则文件中的任何规则和导入规则文件的初始规则。 下面给出了一个例子。
可对导入进行注记以控制其在检查器中的属性演示。 请参阅注记。
示例
导入和属性传播
此示例说明了如何导入规则文件、如何引用导入的规则(或属性和函数)以及如何传播属性值。
导入规则文件
在以下规则文件 structure.cga 中,规则 Lot 用于执行拉伸。 拉伸高度由属性 height 指定。 如果单独使用此规则文件,则拉伸高度为 10。 如果导入此规则文件,则 height 可能具有不同的值。
// structure.cga
attr height = 10
Lot --> extrude(height)
导入规则文件
以下规则文件 main.cga 将导入规则文件 structure.cga。 规则 Init 使用前缀标识符 st 引用了 structure.cga 的规则 Lot。 此外,还定义了一个属性 height,该属性可能覆盖导入规则文件中的相同属性。 由于还在 structure.cga 中定义了属性 height,因此将传播该值,并且拉伸高度为 20。
// main.cga
import st : "structure.cga"
attr height = 20
Init --> st.Lot
拉伸规则覆盖
此示例说明了如何在 import 语句中重新定义扩展规则以及如何在重新定义中使用初始规则。
简单庙宇模型
在以下规则文件 temple.cga 中,初始规则 Temple 生成一个简单的寺庙模型。 每列由扩展规则 Column 生成。 屋顶由扩展规则 Roof 生成。 列的高度由属性 columnHeight 设置。 扩展规则和属性都可以在 import 语句中重新定义,以自定义庙宇模型。
// temple.cga
attr columnHeight = 12
start Temple --> CreateColumns
CreateRoof
extension Column --> primitiveCube
extension Roof --> roofHip(22)
const columnWidth = columnHeight/9
CreateColumns -->
offset(-columnWidth, border)
comp(f) { all :
extrude(columnHeight)
split(x) {
{ ~columnWidth : Column | ~2*columnWidth : NIL }* | ~columnWidth : NIL
}
}
CreateRoof --> t(0,columnHeight,0) Roof
生成的模型如下所示:
自定义列
在以下规则文件 corinthianColumn.cga 和 ionicColumn.cga 中,规则 CorinthianColumn 和 IonicColumn 以与 temple.cga 中规则 Column 定义的默认行为不同的方式生成列。 CorinthianColumn 和 IonicColumn 都被定义为初始规则,因此可以在 import 语句的规则覆盖中使用。
// corinthianColumn.cga
start CorinthianColumn --> split(y) { ~1 : Shaft | '0.1 : Base }
Base --> primitiveCube
Shaft --> s('0.8, '1,'0.8) center(xz) primitiveCube
// ionicColumn.cga
start IonicColumn --> split(y) { '0.1: Base | ~1 : Shaft | '0.1: Base }
Base --> primitiveCube
Shaft --> primitiveCylinder
自定义庙宇模型
以下规则文件 myTemple.cga 使用前缀标识符 CorinthianTemple 和前缀标识符 IonicTemple 导入规则文件 temple.cga。 在每个 import 语句中,将重新定义属性 columnHeight 和扩展规则。 Column 的重新定义分别调用了 corinthianColumn.cga 和 ionicColumn.cga 的初始规则。 Roof 规则的重新定义设置了颜色并调用了当前规则集中的规则 MyRoof(在同一个规则文件中)。 在 Init 规则中调用 temple.cga 的初始规则。 根据使用的前缀标识符,生成不同的庙宇模型。
// myTemple.cga
import CorinthianColumn : "corinthianColumn.cga"
import CorinthianTemple : "temple.cga" (
columnHeight = 8,
Column --> CorinthianColumn.start,
Roof --> color(1,0.5,0.5) MyRoof )
import IonicColumn : "ionicColumn.cga"
import IonicTemple : "temple.cga" (
columnHeight = 16,
Column --> IonicColumn.start,
Roof --> color(1,0.5,0) MyRoof )
@Enum("Corinthian", "Ionic")
attr type = "Corinthian"
Init --> case type == "Corinthian" : CorinthianTemple.start
else : IonicTemple.start
MyRoof --> roofGable(22)
生成的模型如下所示: