comp 操作

语法

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

参数

  1. component - selector
    要分割为的组件
    • f - 面。
    • e - 边。
    • fe - 面边。
    • v - 折点。
    • g - 组。
    • m - 材料。
    • h - 孔洞。
  2. 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 开始)。
  3. operator
    运算符用于定义如何使用所选组件生成后续形状。 有效运算符如下:
    • : 将每个所选组件放入新形状。
    • = 所有选定组件将合并成一个新形状。
  4. operations
    要在新创建的形状上执行的形状操作的顺序。

描述

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

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

新生成的形状的局部坐标系(pivotscope)根据几何的拓扑对齐;组件分割是可操纵形状枢轴的几个形状操作之一。

  • f

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

  • e

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

  • fe

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

  • v

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

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 选择器。

相关内容

示例

立面选择/面分割细节

让我们将建筑物的质量模型分为主立面和许多侧立面。 注意枢轴的方向(带注记的轴)。

分割前质量模型
Building-->	
   comp(f) { front : color("#ff0000") Main.
           | side  : color("#0000ff") Side.
           }
应用分割

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

每个面都是新形状的几何。

选择器 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. }
已将顶面和前面组合到单个形状中

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

Triangle -->
   comp(f) { geometry.area() > 1 && !inside : X. }
已选择表面积大于 1 的表面

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

mySelectorFunc = 
    geometry.isOriented(top) || geometry.nVertices==3

Sphere -->
   comp(f) { mySelectorFunc : X. }
选择顶面以及正好具有 3 个折点的所有面

基于索引的选择

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

分解前的网格

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

Tube-->
   comp(f) { 0 : X 
           | 2 : X 
           | 4 : X  }
具有选定面的网格

修剪平面

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

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(20)
   comp(f) { side : Sides }
具有五个新形状的运算符

相反,对于选择器所选择的所有组件,使用 "=" 运算符都会得到一种新的形状。 在下面的示例中,为拉伸几何的所有五个侧面创建一个形状。 新形状的几何包含所有五个面,并且相对于第一个选定面设置了枢轴和范围。

Lot-->
   extrude(20)
   comp(f) { side = Sides }
具有合并形状的运算符

边界和内部选择器

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

具有细分平面的初始形状

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

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 及表面标签

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

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

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

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()
isTagged 边

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

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)
isTagged 折点

注:

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

高级标签选择

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

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

请注意,同时还将选择标记为 "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()
选择具有共享折点的彩色立方体的所有边

边分割细节

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

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

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

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

折点分割细节

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

Lot-->
   extrude(10) 
   MassModel
   comp(v) { all : VShapes }
具有折点分割的质量模型

组分割细节

树模型被分割为组。

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. }
树模型材料分割