comp 操作

语法

  • comp(component) { selector operator operations | ... }
  • comp(component, scopeAlignment) { selector operator operations | ... }

参数

  1. component - selector
    要分割为的组件:
    • f - 面
    • e - 边
    • fe - 面边
    • v - 折点
    • fv - 面折点
    • g - 组
    • m - 材料
    • h - 孔洞
  2. scopeAlignment - selector
    • zUp - 默认值。 枢轴和范围一致。 请参阅下文
    • noAlign - 枢轴和范围不变。 对范围大小和位置进行调整以适合组件。
  3. selector - (selector、bool、float)
    • { front | back | left | right | top | bottom } - 通过将分量的 y 法线方向划分为相应的象限(相对于当前形状的范围坐标系)来分析其 y 法线。
    • { object.front | object.back | object.left | object.right | object.top | object.bottom | object.side } - 通过将分量的 y 法线方向划分为相应的象限(相对于当前初始形状的对象坐标系)来分析它们的 y 法线。
    • { world.south | world.north | world.west | world.east | world.up | world.down | world.side } - 通过将分量的 y 法线方向划分为相应的象限(相对于世界坐标系)来分析它们的 y 法线。
    • { vertical | horizontal | aslant | nutant } - 相对于当前形状的局部坐标系的 xz 平面分析 y 法线。 法线和 xz 平面之间的角度用于对分量进行分类,范围以度为单位:
      • 水平:]78.75, 90]
      • 倾斜:]11.25, 78.75]
      • 垂直:]-11.25, 11.25]
      • 下垂:]-78.55, -11.25]
      • 水平:]-90, -78.75]
    • side - 选择除水平分量外的所有分量。
    • { border | inside } - 分别位于几何边界或完全位于几何内部的组件。 边界边仅连接到一个面;边界面包含一个或多个边界边;边界折点是一个或多个边界边的起点或终点。 该选择器不适用于孔洞。
    • { eave | hip | valley | ridge } - 这些选择器仅适用于边,并且设计为与屋顶结合使用。 有关详细信息,请参阅以下部分
    • { street.front | street.back | street.left | street.right | street.side } - 如果 streetWidth 属性在初始形状上可用,这些选择器可用于识别面向街道的组件。 有关详细信息,请参阅以下部分
    • all - 选择所有组件。
    • { isTagged(tagQuery) | isTagged(tagQuery, subcomponent) } - 选择标记组件:有关详细信息,请参阅以下部分
      • tagQuery - string

        标签查询

      • subcomponent - selector

        { e | v } - 如果指定,则当 tagQuery 与其任何子组件(边或折点)匹配时,将选择该组件。 有关详细信息,请参阅以下部分

        注:

        存储在面上的标签还标识其边和折点,而存储在边上的标签还标识其两个折点端点。

    • 逻辑表达式 (bool) - 选择表达式计算结果为 true 的所有组件。 用户定义的函数以及上述选择器均可在表达式中使用。
    • index (float) - 选择第 index 个组件(从 0 开始)。
  4. operator
    运算符用于定义如何组合所选组件以生成后续形状。 有效运算符如下:
    • : 将每个所选组件放入新形状。
    • = 所有选定组件将合并成一个新形状。
    • =: 将每个选定组件的连接集合组合为一个新形状。
  5. operations
    要在新创建的形状上执行的形状操作的顺序。

描述

通过 comp 操作(组件分割),可以将形状划分为拓扑组件,这些拓扑组件可以是面、边、折点、组、材料或孔洞。 可以使用 index 或一组选择器来选择组件。 如果至少一个几何组件(通常是一个面)满足要求,则组和材料组件满足特定的选择关键字。 选定的组件将转换为新的形状,并通过一系列形状操作进行处理。 根据 operator,将为每个单独的选定组件创建一个形状 (:),为整个选定组件集创建一个形状 (=),或者为选定组件的每个连接子集创建一个形状 (=:)。 如果两个组件的面共享一条边,则这两个组件相连。 如果没有面的组件共享一个折点,则这两个组件相连。

组件分割的选择参数以排除方式工作:如果参数选择了特定组件,则该组件不能成为另一个选择的一部分(从左到右)。

新生成的形状的局部坐标系(pivotscope)根据几何的拓扑对齐;组件分割是可操纵形状枢轴的几个形状操作之一。 当 scopeAlignment 设置为 noAlign 时,将取消激活此行为。

  • f

    如果是面组件分割,则 x 轴将平行于面的第一条边,z 轴将指向面的法线。 枢轴将位于面的第一个边的第一个折点;范围将是面的边界框,即,新兴形状的范围的 z 维度设置为零。 请参阅示例

  • e

    如果是边组件分割,枢轴和范围的 x 轴沿着边,而 z 轴指向相邻面的法线的平均值。 范围的 y 和 z 维度设置为零,x 维度是边的长度。 枢轴将位于边的端点之一。 边的索引如下:索引 0 是第一个面的第一条边,索引 1 是第一个面的第二条边,以此类推。共享的边在第二次遇到时被跳过。 请参阅示例

  • fe

    与边相反,面边被视为对于每个面都是单独的。 首先按照面建立索引,其次是按照每个边建立索引,但不会跳过共享边。 此外,与边相反,面边具有唯一的方向,该方向由其所属的面的方向确定。 枢轴和范围的 x 轴面向面,z 轴指向与边垂直的面和面法线。 枢轴将位于面边的第一个折点。 请参阅示例

  • v

    如果是折点组件分割,枢轴位于折点处,z 轴将指向相邻面法线的平均值,并且所有范围维度均设置为零。 请参阅示例

  • fv

    与折点相反,面折点被视为对于每个面都是单独的。 首先按照面建立索引,其次是按照每个折点建立索引。 枢轴和范围的 x 轴指向面方向(即切线),z 轴指向面外侧,与切线和面法线正交。 y 轴沿着面法线。 枢轴位于折点处。 如果应用于边组件,则切线/x 轴指向边方向。 请参阅示例

comp 形状属性

每个生成的形状都设置了许多 comp 形状属性,请参阅 comp 属性

修剪平面

此外,对于面,组件分割会生成修剪平面。 修剪平面以二等分角沿着新面的共享边放置。 修剪平面的目的是双重的。 一方面,修剪可处理两个相邻面的边界上的几何交叉点,而另一方面,修剪可用于处理非矩形面。 修剪平面是使用插入操作原始操作修剪操作来应用的。

根据共享边的方向,修剪平面分为水平平面和垂直平面。 可以通过将修剪属性设置为 true 或 false 来打开或关闭它们。 默认情况下,垂直修剪平面的修剪功能将被激活,而水平修剪平面的修剪功能将被取消激活。 查看下面的修剪平面示例。

注:

仅当使用 : 运算符时才会生成修剪平面。

可以在程序化运行时首选项中配置修剪平面。

遮挡物形状

在应用组件分割之前,自动生成遮挡物形状。 遮挡物形状设置为适用于未标注遮挡查询

屋顶边

有许多选择器旨在对典型的屋顶边进行分类:

  • eave - 屋顶底部的水平边界边。 边始终围绕原始面逆时针定向。
  • hip - 内部边连接到至少一个屋檐边。 四坡边始终朝上,即终点的 y 坐标比起点大。
  • valley - 两个连接面形成凹陷的内部边。 山谷边始终朝上,即终点的 y 坐标比起点大。
  • ridge - 并非四坡或山谷的内部边。 山脊边始终朝上,即终点的 y 坐标比起点大。

这些选择器只能应用于边组件分割。

下图显示了示例。

屋顶边

街道选择器

可以使用 street.front 选择器选择与街道相邻的组件,可以使用 street.back 选择器选择后部组件,并且可以使用 street.leftstreet.right 选择器选择位于前后之间的组件。 street.side 合并左右组件。 以下是 street.xxx 选择器的示例。

街道选择器 1
街道选择器 2

这些选择器取决于 streetWidth 属性映射的可用性。请参阅自动生成的街道宽度属性。 如果该属性不可用,则组件选择将回退到 object.xxx 选择器。

相关内容

示例

立面选择/面分割细节

将质量模型分割为其各个立面。 注意枢轴和范围(带注记的轴)的位置和方向。

Lot -->
   extrude(5)
   color(1,1,1,0.75)
分割前质量模型

现在,每个面都是新形状的几何。 范围和枢轴取决于面方向。 x 轴将指向第一条边,z 轴将指向面法线。 范围的 z 维度为零。

Lot -->
   extrude(5)
   comp(f) { right : color(1,1,0,0.75) Right. | 
             side  : color(1,1,1,0.75) Side.  }
应用分割

当使用 noAlign 模式时,枢轴将保持不变。 范围方向保持不变。

Lot -->
   extrude(5)
   comp(f,noAlign) { right : color(1,1,0,0.75) Right. | 
                     side  : color(1,1,1,0.75) Side.  }
使用 noAlign 模式时,枢轴保持不变

选择器 1:基于象限

Sphere-->
   comp(f) { top    : color("#0000ff") X 
           | bottom : color("#ffff00") X 
           | front  : color("#ff0000") X 
           | back   : color("#ff00ff") X 
           | left   : color("#00ffff") X 
           | right  : color("#00ff00") X }

通过使用选择器为球面几何的表面着色来演示选择器。 该选择与局部坐标系(显示的范围)相对。

基于象限的选择器

选择器 2:基于与 y 轴的角度

Sphere -->
    comp(f){ horizontal : color("#0000ff") X 
           | aslant     : color("#ff0000") X 
           | vertical   : color("#ffff00") X 
           | nutant     : color("#ff00ff") X }

注意球体两极上的水平区域(蓝色)。

基于与 y 轴的角度的选择器

逻辑选择表达式

Sphere --> comp(f) { top || front = X. }

可以在逻辑选择器表达式中使用静态选择器。 可同时将顶面和前面组合到单个形状中。

已将顶面和前面组合到单个形状中
Triangle -->
   comp(f) { geometry.area() > 1 && !inside : X. }

将仅选择表面积大于 1 并且不在内部的表面。

已选择表面积大于 1 的表面
mySelectorFunc = 
    geometry.isOriented(top) || geometry.nVertices==3

Sphere -->
   comp(f) { mySelectorFunc : X. }

将使用自定义函数以选择顶面以及正好具有 3 个折点的所有面。

选择顶面以及正好具有 3 个折点的所有面

基于索引的选择

通过按索引直接查找网格,也可以将网格分解成其组件。 索引方案本质上是在模型本身中进行编码的。

分解前的网格
Tube -->
   comp(f) { 
      0 : X. | 
      2 : X. | 
      4 : X. 
   }

仅选择圆柱的面 0、2 和 4。

具有选定面的网格

修剪平面

Start-->
   s(10,10,10)
   primitiveCube()
   comp(f) {5 : X }

在共享边处,插入修剪平面(绿色)。

具有共享边的修剪平面
X-->
   s(15,'1, 2)
   center(xyz)
   primitiveCube()

使用修剪平面剪切插入的几何。

修剪平面剪切几何
Start-->
   s(10,10,10)
   primitiveCube()
   set(trim.horizontal, true)
   comp(f) {5 : X }

默认情况下,水平修剪平面已关闭。 在插入几何之前启用它们会得到不同的结果。

启用了水平面的修剪平面

运算符

分隔运算符:

Lot -->
   extrude(10)
   comp(f) { front :  color(rand,rand,rand)
                      Front.
           | all   =  Mass. }

对于 selector 所选择的每个组件,使用 : 运算符都会得到新形状。 在以上示例中,将为拉伸几何的每个 front 面创建一个形状。 因此,Lot 形状具有 6 个正面后继形状(加上 Mass 中其余面的一个后继形状)。 每个 Front 后继形状的枢轴和范围的设置都不同。

为每个正面创建六个正面形状六个正面形状的形状树

组合运算符 =

Lot -->
   extrude(10)
   comp(f) { front =: color(rand,rand,rand)
                      Front.
           | all   =  Mass. }

对于 selector 所选择的所有组件,使用 = 运算符都会得到一种新的形状。 在以上示例中,将为拉伸几何的六个 front 面创建一个 Front 形状。 因此,Lot 形状具有一个 Front 后继形状。 将相对于第一个选定 front 面设置枢轴和范围。

为六个正面形状创建一个正面形状一个正面形状的形状树

连接运算符 =:

Lot -->
   extrude(10)
   comp(f) { front =: color(rand,rand,rand)
                      Front.
           | all   =  Mass. }

对于 selector 所选择的所有组件的每个连接子集,使用 =: 运算符都会得到新形状。 在以上示例中,将为拉伸几何的六个 front 面创建两个 Front 形状。 在每个 Front 形状中,将通过共享边连接所有面。 因此,Lot 形状具有两个 Front 后继形状。 每个后继形状中的枢轴和范围均相对于其第一个面进行设置。

为六个正面创建两个正面形状两个正面形状的形状树

边界和内部选择器

图片显示了初始形状。 它是一个细分平面,由多个面组成。

具有细分平面的初始形状
Init -->
   comp(f) { border : FBorder | inside : FInside }
   
FBorder -->
   color("#ff0000")
	
FInside -->
   color("#00ff00")

该示例选择边界和内部面并为其着色。

具有彩色边界和面的形状
 Init-->
   comp(e) { border : EBorder | inside : EInside }

EBorder --> s('1, 0.05, 0.05) t(0, '-0.5, 0)
            color("#ff0000") primitiveCube()
	
EInside --> s('1, 0.01, 0.01) t(0, '-0.5, 0)
            color("#00ff00") primitiveCube()

在此处,选择了边界和内部边,并插入了彩色立方体。

已插入彩色立方体的形状
Init -->
   comp(v) { border : VBorder | inside : VInside }
   
VBorder --> s(0.05, 0.05, 0.05) t(-0.025, -0.025, -0.025)
            color("#ff0000") primitiveCube()
   
VInside --> s(0.05, 0.05, 0.05) t(-0.025, -0.025, -0.025)
            color("#00ff00") primitiveCube()

最后,边界和内部折点用于插入彩色立方体。

具有由折点插入的彩色立方体的形状

isTagged 选择器

Init --> envelope(normal,4, 0,45, 3,45, 2.5,50, 2,50)
         ShowEnvelopeAutoTags
         
ShowEnvelopeAutoTags -->
    comp(f) { isTagged("envelope.bottom")     : Blue 
            | isTagged("envelope.side.base")  : Yellow
            | isTagged("envelope.side.slope") : Orange
            | isTagged("envelope.side.inner") : Red
            | isTagged("envelope.top")        : Green }

本示例将根据包络操作应用的表面标签为表面组件着色。

isTagged 及表面标签
Init --> envelope(normal,4, 0,45, 3,45, 2.5,50, 2,50)
         comp(f) { isTagged("envelope.side") : Yellow }

将使用标签查询 "envelope.side" 以同时选择所有底面、斜面和内侧面并为其着色。

isTagged 及标签查询
Init --> envelope(normal,4, 0,45, 3,45, 2.5,50, 2,50)
         comp(e) { isTagged("envelope.top") : Edge }
         
Edge --> s('1, 0.5, 0.5) center(yz)
         color("#09de1f") primitiveCube()

将选择标记为 "envelope.top" 的表面边并插入彩色立方体。

isTagged 边
Init --> envelope(normal,4, 0,45, 3,45, 2.5,50, 2,50)
         comp(v) { isTagged("envelope.top") : Edge }
         
Edge --> s(0.5, 0.5, 0.5) center(xyz)
         color("#09de1f") primitiveSphere(8,6)

将选择标记为 "envelope.top" 的表面折点并插入彩色球体。

isTagged 折点

注:

默认情况下,可以根据相邻表面的标签选择边,可以根据相邻表面和边的标签选择折点。 但是,要根据边或折点的标签选择表面,必须提供 subcomponent 参数,如以下部分所示。

高级标签选择

Init --> envelope(normal,4, 0,45, 3,45, 2.5,50, 2,50)
         comp(f) { isTagged("envelope.bottom", e) 
            : ShowEnvelopeAutoTags }

通过使用 e 子组件选择器,将选择与标记为 "envelope.bottom" 的表面共享边或者具有此类标记的边的所有表面。

请注意,同时还将选择标记为 "envelope.bottom"(蓝色)的表面。

子组件选择器
Init --> envelope(normal,4, 0,45, 3,45, 2.5,50, 2,50)
         comp(f) { isTagged("envelope.bottom", e) &&
                   isTagged("envelope.side.slope") 
            : ShowEnvelopeAutoTags }

本示例将选择与底面的边相邻的所有斜面。

已选择斜面
 Init --> envelope(normal,4, 0,45, 3,45, 2.5,50, 2,50)
         comp(e) { isTagged("envelope.bottom", v)
            : Edge }
            
Edge --> s('1, 0.5, 0.5) center(yz)
         color("#09de1f") primitiveCube()

本示例将选择与底面共享折点的所有边并插入彩色立方体。

选择具有共享折点的彩色立方体的所有边

边分割细节

Lot --> extrude(3) 
        comp(e) { all : primitiveCube()
        s('1, 0.25, 1) X. }

建筑物质量模型被分割为其边,并且内置立方体模型被插入到每个边形状中。 将新形状的 pivot 设置为边的起始顶点,对齐方式如下:x 轴指向边,z 轴为相邻面法线的平均值,y 轴与另外两个从前的轴垂直。 范围的平移和旋转为零,大小为(边长度,0,0)。

质量模型边分割
Lot --> extrude(3) 
        comp(fe) { all : primitiveCube() 
        s('1, 0.25, 1) X. }

分割为面边会创建更多组件,对于每个面,都将边分开来处理。 边朝向面方向。 现在将 pivot 设置为边的起始折点,x 轴指向面方向,z 轴指向与边垂直的面和面法线。

质量模型面边分割

折点分割细节

Lot-->
   extrude(10) 
   MassModel
   comp(v) { all : VShapes }

建筑物质量模型被分割为其折点。 新形状的枢轴(上述规则中的 VShapes)设置为折点位置,对齐方式如下:z 轴是相邻面法线的平均值,并且选择了 x 轴和 y 轴,以使其彼此垂直。 范围的平移、旋转和大小为零。

具有折点分割的质量模型
Lot -->
   comp(fv) { all : VShapes. }

将多边形分割为其面折点。 新形状的 pivot(上述规则中的 VShapes)设置为折点位置,对齐方式如下:x 轴为多边形的切线,z 轴指向多边形的外部,y 轴为多边形的面法线。 scope 的平移、旋转和大小为零。

多边形已分割为面折点

组分割细节

Lot-->
   i("Orange_Tree_Model_0.obj") 
   comp(g) { findFirst(geometry.materials,"Bark") : Trunk.
           | all = set(material.opacity, 0.2) Foliage. }
树模型被分割为组。

树模型组分割

材料分割细节

Lot-->
   i("Orange_Tree_Model_0.obj") 
   comp(m) { findFirst(geometry.materials,"Foliage") : Oranges. 
           | findFirst(geometry.materials,"Bark")    : Trunk. }
树模型被分割为材料。 在这种情况下,组和材料是相同的。

树模型材料分割