语法

  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

 

生成的模型如下所示:

GUID-20A6EB1B-23B3-4AB3-ADE5-E7099DB10AA5-web

自定义列

在以下规则文件 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)

 

生成的模型如下所示:

GUID-5E7669F8-D524-45C3-B609-CA5F0BD17D7A-web
type == “Corinthian”
GUID-EBABEDC8-F515-478E-8F43-E9FA4C91804B-web
type == “Iconic”