索引
HT
提供的ht.Shape
是极其强大的图元类型,其在GraphView
和Graph3dView
组件上都能展示出各种二维和三维的形状效果,
其扩展子类ht.Polyline
可实现三维空间管道的功能,扩展子类ht.CSGShape
可实现挖空等功能效果,本手册将逐一进行详细介绍。
ht.Shape
类型在GraphView
组件上用于呈现多边形图元,其形状主要由points
和segments
这两个属性描述:
points
为ht.List
类型数组的顶点信息,顶点为{x:100, y:200}
格式的对象;segments
为ht.List
类型的线段数组信息,
线段为1~5
的整数,分别代表不同的顶点连接方式。
如果segments
为空,则代表points
数组中的顶点按数组顺序依次直线连接,因此直线段的类型无需设置segments
参数。
segments
主要用于需要绘制曲线,或者有跳跃断点的情况,其1~5
的取值含义说明如下:
moveTo
,占用1
个点信息,代表一个新路径的起点lineTo
,占用1
个点信息,代表从上次最后点连接到该点quadraticCurveTo
,占用2
个点信息,第一个点作为曲线控制点,第二个点作为曲线结束点bezierCurveTo
,占用3
个点信息,第一和第二个点作为曲线控制点,第三个点作为曲线结束点closePath
,不占用点信息,代表本次路径绘制结束,并闭合到路径的起始点ht.Shape
的主要属性函数:
getPoints()
和setPoints(points)
获取和设置点数组,参数为Array
类型则内部转换成ht.List
,为空则清除所有点addPoint(point, index)
在指定的索引位置插入新点,index
为空则插入到最后setPoint(index, point)
在指定的索引位置替换新点removePointAt(index)
删除指定索引位置的点toPoints()
拷贝一份新的ht.List
类型顶点数组segments
属性为Array
或ht.List
类型,用于描述点连接样式,数组元素为整型值: moveTo
,占用1
个点信息,代表一个新路径的起点lineTo
,占用1
个点信息,代表从上次最后点连接到该点quadraticCurveTo
,占用2
个点信息,第一个点作为曲线控制点,第二个点作为曲线结束点bezierCurveTo
,占用3
个点信息,第一和第二个点作为曲线控制点,第三个点作为曲线结束点closePath
,不占用点信息,代表本次路径绘制结束,并闭合到路径的起始点isClosePath()
和setClosePath(true)
获取和设置多边形是否闭合,默认为false
,墙面类型通过设置闭合可无缝连接起始点 getLength(resolution)
获取多边形长度,resolution
为曲线微分片数,不传入则HT
会采用系统默认值
ht.Shape
类型的points
值与width
、height
和position
这三个大小和位置信息存在联动关系, 即修改points
会影响width
、height
和position
相应值,同理修改width
、height
和position
值也会影响points
信息。
ht.Shape
相关的style
属性:
shape.border.width
边框宽度,默认值为0
表示不绘制边框shape.border.color
边框颜色shape.border.cap
边框末端线帽的样式,可选参数为butt|round|square
shape.border.join
边框当两条线交汇时创建边角的类型,可选参数为bevel|round|miter
shape.border.pattern
显示虚线样式,Array
类型,例如[5, 5]
shape.background
背景填充颜色,为null
代表不填充背景shape.gradient
渐近色类型:shape.background
纯色填充背景。'linear.southwest','linear.southeast','linear.northwest','linear.northeast',
'linear.north','linear.south','linear.west','linear.east',
'radial.center','radial.southwest','radial.southeast','radial.northwest','radial.northeast',
'radial.north','radial.south','radial.west','radial.east',
'spread.horizontal','spread.vertical','spread.diagonal','spread.antidiagonal',
'spread.north','spread.south','spread.west','spread.east'
shape.gradient.color
背景渐近颜色 shape.repeat.image
填充重复背景的图片,注意这里的图片不支持矢量shape.dash
是否显示虚线,默认值为false
shape.dash.pattern
虚线样式,默认值为[16, 16]
shape.dash.offset
虚线偏移,默认值为0
shape.dash.color
虚线颜色shape.dash.width
虚线宽度,默认为空代表采用shape.border.width
值 shape.dash.3d
虚线是否显示3d
效果,默认值为false
shape.dash.3d.color
虚线3d
效果颜色,为空采用默认白色,呈现3d
效果时连线的中间部分为该颜色shape.dash.3d.accuracy
虚线3d
效果精确度,该值越小3d
渐进效果越好但影响性能,一般情况无需修改
ht.Polyline
类型继承于ht.Shape
,其更多表现出与ht.Edge
连线类似的特性,因此ht.Polyline
上
的label
、note
和icons
等附属部分位置和方向与连线类型类似会考虑折线的角度,从以下例子可只看出两者附件摆放的差异。
从以上例子可发现ht.Polyline
关闭了setRotation
的旋转功能,更多差异见空间管线章节
ht.Node
图元通过setHost(host)
函数可吸附到另外一个图元上,这样host
图元进行移动和旋转时都会带动attach
的吸附图元。
当host
图元为ht.Shape
类型时,则如果attach
图元设置上attach.*
的相关属性,可使得图元吸附到ht.Shape
的指定线段位置上。
attach.index
:默认值为-1
,指定吸附到ht.Shape
图元所在线段索引attach.offset
:默认值为0
,指定吸附在ht.Shape
图元所在线段偏移位置attach.offset.relative
:默认值为false
,如果为true
则偏移量代表所在线段长度乘以attach.offset
值attach.offset.opposite
:默认值为false
,指定吸附到ht.Shape
图元所在线段的正方向还是反方向偏移attach.gap
:默认值为0
,指定吸附到ht.Shape
图元所在线段垂直方向的偏移attach.gap.relative
:默认值为false
,如果为true
则与线段垂直方向的偏移为所ht.Shape
的thickness
值乘以attach.gap
attach.thickness
:默认值为空,CSGNode
默认值为1.001
,为正值时吸附图元height
属性值由host
的thickness
乘该值决定吸附到
ht.Shape
线段的功能目前不支持segments
设置为曲线的情况,也不考虑ht.Shape
设置了rotation
旋转值的因素, 当图元吸附到ht.Shape
线段之后,其rotation
和position
位置会根据ht.Shape
的自动变化同步;如果设置了attach.thickness
值, 则图元的height
也会根据host
的thickness
值自动调节,这些联动属性一般不需要用户设置。
ht.Shape
图元当thickness
属性小于0
时常用于呈现地板效果的多边形模型,这种类型下tall
属性决定地板的厚度,
一般常通过floor.setElevation(floor.getTall()/2);
的方式将地板设置在海平面上。
地板类型由shape3d.top.*
控制顶面参数,shape3d.bottom.*
控制底面参数,shape3d.*
控制厚度四周参数。
对于只需要平面不需要立体效果的情况,可通过将shape3d.bottom.visible
和shape3d.visible
的底面和四周可见参数设置为false
实现。
GraphView
的二维上ht.Shape
实现平铺贴图可通过shape.repeat.image
属性设置,Graph3dView
三维的平铺
可通过shape3d.top.uv.scale
和shape3d.top.bottom.scale
控制,但这种方式如果地板的大小发生变化时,
一般还需要再设置参数因此并不方便,HT
提供的repeat.uv.length
参数可解决这种问题,通过设置该参数,
贴图会根据图形大小自动调节平铺图片数,而且还能与shape3d.top.uv.scale
和shape3d.top.bottom.scale
的参数进行叠加,
当然大部分情况下如果设置了repeat.uv.length
,就不需要设置shape3d.top.uv.scale
和shape3d.top.bottom.scale
参数。
ht.Shape
图元当thickness
属性大于0
时常用于呈现墙面效果的多边形模型,这种类型下tall
属性决定墙面的高度,
thickness
代表墙厚度,一般常通过wall.setElevation(wall.getTall()/2);
的方式将墙面设置在海平面上。
处于墙面类型时,模型相当于长条的六面体,因此可通过all.*
、left.*
或right.*
等六面体参数进行控制,
参见3D手册六面体章节
ht.Shape
图元当shape3d
属性为cylinder
时,图元呈现为圆筒管道的模型效果,tall
和thickness
决定圆筒切面的宽高值,
当tall
和thickness
值一样时呈现为圆形切面,管道的走向由points
和segments
决定。
管道由shape3d.top.*
控制顶面参数,shape3d.bottom.*
控制底面参数,shape3d.*
控制管道走向的中间部分效果。
通过将shape3d.top.visible
和shape3d.bottom.visible
设置为false
,可实现空心管道的效果。
以上介绍的类型都是基于{x: 10, y: 20}
的二维点信息描述图形走向,ht.Polyline
继承于ht.Shape
,
支持{x: 10, y: 20, e: 30}
格式的三维空间点描述,如果e
值为空则取elevation
的海拔值,
修改ht.Polyline
的elevation
和tall
值时,会自动调节points
顶点中的e
值;
同理points
顶点信息变化也会同步修改ht.Polyline
的elevation
和tall
值。
x
代表三维的x
轴坐标y
代表三维的z
轴坐标,参见3D手册e
代表三维的y
轴坐标,可理解为elevation
的简写,代表三维y
轴的海拔高度ht.Polyline
同样支持基础属性章节介绍的segments
参数,实现从二维的平面曲线延伸到了三维的空间曲线效果。
ht.Polyline
关闭了 setClosePath
函数功能。
ht.Edge
和ht.Polyline
在展示效果上是很类似的,只不过ht.Edge
的起始和结束点来自于source
和target
节点,
ht.Edge
的edge.type
属性为points
时,edge.points
和edge.segments
对应于
ht.Polyline
的points
和segments
属性,此时edge.points
的顶点信息也可为{x: 10, y: 20, e: 30}
的三维顶点格式,
其中e
值为空时代表0
。
ht.Edge
和ht.Polyline
都有两种展示方式,默认显示为普通线框效果,当shape3d
设置为cylinder
时则显示为立体管线的效果,
HT
通过微分段的方式实现曲线,因此为达到更高的均分曲线效果,两种方式都可通过shape3d.resolution
控制曲线微分段数。
普通线框效果:
ht.Edge
通过edge.width
控制宽度ht.Edge
通过edge.color
控制颜色ht.Edge
通过edge.gradient.color
控制颜色 ht.Polyline
通过shape.border.width
控制宽度ht.Polyline
通过shape.border.color
控制颜色 ht.Polyline
通过shape.border.gradient.color
控制渐进色
立体管线的效果
ht.Edge
通过edge.width
控制宽度ht.Polyline
通过thickness
控制宽度 ht.Edge
和ht.Polyline
都可通过shape3d.*
控制颜色和贴图等其他样式参数ht.Edge
和ht.Polyline
都可通过shape3d.side
控制管道截面边数,如设置为6
,则显示为六面体截面ht.Edge
和ht.Polyline
都可通过shape3d.start.angle
控制管道截面起始边的角度ht.Edge
和ht.Polyline
都可通过shape3d.sweep.angle
控制管道截面的跨越角度,默认是 2 PIht.Edge
和ht.Polyline
都可通过repeat.uv.length
控制贴图在管道走向方向上的自动平铺次数 ht.Edge
和ht.Polyline
都通过shape3d.top.cap
和shape3d.bottom.cap
控制起始结束部分,可取值如下:undefined
:默认值,代表镂空不封闭flat
:代表平面进行封闭round
:代表圆形体进行封闭Edge
和Polyline
处于普通线框效果时可实现虚线的功能,有两种虚线效果:
实空交替:
ht.Edge
通过edge.pattern
控制虚线模式,默认为空,设为[20, 10]
代表一段长度20
的实线,一段长度10
的镂空,重复交替ht.Polyline
通过shape.border.pattern
控制虚线模式,默认为空,设为[20, 10]
代表一段长度20
的实线,一段长度10
的镂空,重复交替
颜色交替:
ht.Edge
通过edge.dash
控制是否启用颜色交替虚线,默认为false
ht.Edge
通过edge.dash.pattern
控制虚线模式,默认为[16, 16]
代表长度16
的edge.dash.color
颜色,和长度16
的edge.coor
颜色重复交替ht.Polyline
通过shape.dash
控制是否启用颜色交替虚线,默认为false
ht.Polyline
通过shape.dash.pattern
控制虚线模式,默认为[16, 16]
代表长度16
的shape.dash.color
颜色,和长度16
的shape.border.coor
颜色重复交替
Graph3dView
默认关闭虚线功能,如需启用可通过graph3dView.setDashDisabled(false)
启动虚线绘制功能。
吸附功能章节介绍ht.Node
可吸附到ht.Shape
类型线段上,
当引入ht-modeling.js的建模扩展包后,
通过继承于ht.Node
的CSGNode
,和继承于ht.Shape
的ht.CSGShape
,可实现多边形墙面挖空的效果。
以上例子将
attach.thickness
设置为1.001
,将高度设置为了setTall(80.001)
, 此处的尾数0.001
是为避免js
浮点数运算的误差多预留的尺寸。
CSGNode
的attach.operation
属性默认值为subtract
,代表可对CSGNode
和CSGShape
类型的host
图元进行裁决挖空,
上例中通过将3d.visible
设置为false
隐藏了用于挖空的CSGNode
,但对于门窗类型的应用,除了通过门窗模型挖空外,
还需要保留门窗的模型,而门窗类型一般厚度比墙面薄些,但如果attach.thickness
小于1
时则无法凿穿墙厚度,
为此建模扩展包还提供了DoorWindow
类型的图元,
方便用户构建门窗类型的模型,DoorWindow
类型图元提供了dw.s3
参数,该参数默认值为[0.999, 0.999, 0.5]
,
代表真正显示在3D
界面上的模型会参考dw.s3
的尺寸再进行缩放,这样attach.thickness
继续保持可凿穿的1.001
即可。
以上介绍的地板类型、墙面类型和管道类型三种类型,
都通过{x: 10, y: 20}
的二维点信息描述图形走向,二维y
坐标映射到三维的z
坐标的转换关系请参见
3D手册。
但这三种类型都支持ht.Shape
的rotationX
、rotationY
和rotationZ
的空间旋转功能,通过设置旋转参数可实现竖立的效果。
以上例子通过不断改变
shape3d.uv.offset
参数可实现管道水平流动和截面方向旋转等特殊效果。