import

语法

  1. import id : filePath
  2. import id ( styleId, ... , styleId ) : filePath
  3. import id : filePath ( attrId, ... , attrId )
  4. import id : filePath ( attrId = expression, ... , attrId = expression )
  5. import id : filePath ( )
  6. import id : filePath ( extensionId --> operations, ... , extensionId --> operations )

参数

  1. id

    导入的规则、属性和函数的唯一前缀。

  2. 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.cgaionicColumn.cga 中,规则 CorinthianColumnIonicColumn 以与 temple.cga 中规则 Column 定义的默认行为不同的方式生成列。 CorinthianColumnIonicColumn 都被定义为初始规则,因此可以在 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.cgaionicColumn.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)

生成的模型如下所示:

type == "Corinthian"
type == "Corinthian"
type == "Iconic"
type == "Iconic"


在本主题中