Brep跟Surface莲花和荷花有什么区别别

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
grasshopper运算器名称总结_new详解.doc 16页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
Grasshopper运算器名称总结
Params:参数
Geometry:几何体
Box: 立方体
BRep: 边界表现形式
Circle: 圆
Circular Arc: 圆弧
Curve: 曲线
Geometry: 几何
Mesh: 网格面
Plane: 平面
Surface: 表面
Twisted box: 扭曲的立方体
Vector: 矢量
Primitive: 数据元素
Boolean: 布尔型
Colour: ARGB色彩
Data: 数据
Data Path: 数据分支
Integer: 整型
Interval: 区间
Interval2: 二维区间
Number: 双精度型浮点数
Shader: 着色器
String: 字符串型
Time: 日期型
Special: 专门的
Bar Graph: 条形统计图
Boolean Toggle: 布尔值切换器
Colour Swatch: 色卡
Custom Preview: 预览自定义
Gradient: 多色彩渐变
Graph Mapper:
Number Slider: 数字滑动条
Panel: 数据显示面板
Param Viewer: 参数结构查看器
Receiver: 数据接收器
Logic 逻辑
Boolean: 布尔运算
Gate And: 并集
Gate And Ternary: 三元并集
Gate Majority:
Gate Nand:
Gate Or Ternary:
Gate Xnor:
List: 列表
Dispatch: 分配(把一个列表中的项目分派到两个目标列表中)
List Item: 清单项
List Length: 列表长度(计算列表的长度)
Null Item:
Reverse List: 反转列表
Shift List: 移动列表
Sort List: 分类列表
Split List: 分拆列表
Sub List: 次级列表(从一个列表中提取子集)
Weave: 编排(使用自定义的式样编排输入流的设置)
Script: 脚本
C# Script: C#脚本
Script: VB脚本
F1?: 一元函数
F2?: 二元函数
F3?: 三元函数
Variable Expression?: 多元函数
Sets: 集合
Cull Nth?: 选取元素(在列表中每n个选取元素)
Cull Pattern?: 选取图案(使用反复的掩码在列表中选取元素)
Duplicate Date?: 复制数据
Fibonacci: 费班纳赛(创建一个费班纳赛序列)
Jitter: 振动
Range: 范围
Series: 数列
Trees: 设计树
Clean Tree: 清理设计树(把数据树中所有空项和无效数据清除掉)
Create Branch: 创建分支(创建一个分支访问路径)
Decompose Branch: 分解分支(分解分支访问路径)
Flatten Tree: “夷平”设计树(把设计树中所有分支路径去除)
Graft tree: 续接设计树
Merge: 合并(把两个数据流合二为一)
Merge Multiple: 合并多项(合并多个输入数据流为一个)
Simplify Tree : 简化设计树(通过清除重复的可共享的分支简化设计树)
Prune Tree: 修剪设计树(从设计树中去掉小的分支路径)
Stream Filter: 数据流过滤器(过滤输入的数据流)
Stream Gate: 数据流闸口(向一个指定的输出项重新传入数据流)
Tree Branch: 设计树分支(从数据树中取回一个指定的分支)
Tree Item: 设计树项目(从数据树中取回一个指定的项目)
Scalar:标量
Constants:常数:
Epsilon: 艾普西龙(四舍五入双精度浮点数)
Golden Ratio: 黄金分割比(1.618)
Natural logarithm: 自然对数(2.718)
Pi: 圆周率(3.14)
Interval:区间:
Bounds: 界限(围绕数字列表创建一个区间)
Bounds 2D: 二维界限(围绕坐标列表创建一个二维的区间)
Divide Interval: 均分区间
Divide Interval2: 均分二维区间
Interval: 区间
Interval Components: 分解一维区间
Interval2: 通过两个一维区间创建二维区间
Interval2: 通过四个数字创建二维区间
正在加载中,请稍后...grasshopper曲面流动的用法-surface-morph | 3d学习网Params:参数Geometry:几何体 Box: 立方体 BRep: 边界表现形式 Circle: 圆 Circular Arc: 圆弧 Curve: 曲线 Geometry: 几何 Line: 线 Mesh: 网格面 Plane: 平面 Point: 点 Surface: 表面 Twisted box: 扭曲的立方体 Vector: 矢量Primitive: 数据元素 Boolean: 布尔型 Colour: ARGB 色彩 Data: 数据 Data Path: 数据分支 Integer: 整型 Interval: 区间 Interval2: 二维区间 Number: 双精度型浮点数 Shader: 着色器 String: 字符串型 Time: 日期型Special: 专门的 Bar Graph: 条形统计图 Boolean Toggle: 布尔值切换器 Colour Swatch: 色卡 Custom Preview: 预览自定义 Gradient: 多色彩渐变 Graph Mapper: Number Slider: 数字滑动条 Panel: 数据显示面板 Param Viewer: 参数结构查看器 Receiver: 数据接收器Logic 逻辑Boolean: 布尔运算 Gate And: 并集 Gate And Ternary: 三元并集 Gate Majority: Gate Nand: Gate Nor: Gate Not: Gate Or: Gate Or Ternary: Gate Xnor: Gate Xor:List: 列表 Dispatch: 分配(把一个列表中的项目分派到两个目标列表中) List Item: 清单项 List Length: 列表长度(计算列表的长度) Null Item:空值(测试一个数据项是否无效) Reverse List: 反转列表 Shift List: 移动列表 Sort List: 分类列表 Split List: 分拆列表 Sub List: 次级列表(从一个列表中提取子集) Weave: 编排(使用自定义的式样编排输入流的设置)Script: 脚本 DotNET C# Script: C#脚本 DotNET VB Script: VB 脚本 F1 : 一元函数 F2 : 二元函数 F3 : 三元函数 Variable Expression : 多元函数Sets: 集合 Cull Nth : 选取元素(在列表中每 n 个选取元素) Cull Pattern : 选取图案(使用反复的掩码在列表中选取元素) Duplicate Date : 复制数据 Fibonacci: 费班纳赛(创建一个费班纳赛序列) Jitter: 振动 Random: Range: 范围 Series: 数列Trees: 设计树 Clean Tree: 清理设计树(把数据树中所有空项和无效数据清除掉) Create Branch: 创建分支(创建一个分支访问路径) Decompose Branch: 分解分支(分解分支访问路径) Flatten Tree: “夷平”设计树(把设计树中所有分支路径去除) Graft tree: 续接设计树 Merge: 合并(把两个数据流合二为一) Merge Multiple: 合并多项(合并多个输入数据流为一个) Simplify Tree : 简化设计树(通过清除重复的可共享的分支简化设计树) Prune Tree: 修剪设计树(从设计树中去掉小的分支路径) Stream Filter: 数据流过滤器(过滤输入的数据流) Stream Gate: 数据流闸口(向一个指定的输出项重新传入数据流) Tree Branch: 设计树分支(从数据树中取回一个指定的分支) Tree Item: 设计树项目(从数据树中取回一个指定的项目)Scalar:标量Constants:常数: Epsilon: 艾普西龙(四舍五入双精度浮点数) Golden Ratio: 黄金分割比(1.618) Natural logarithm: 自然对数(2.718) Pi: 圆周率(3.14)Interval:区间: Bounds: 界限(围绕数字列表创建一个区间) Bounds 2D: 二维界限(围绕坐标列表创建一个二维的区间) Divide Interval: 均分区间 Divide Interval2: 均分二维区间 Interval: 区间 Interval Components: 分解一维区间 Interval2: 通过两个一维区间创建二维区间 Interval2: 通过四个数字创建二维区间 Interval2 Components: 分解一个二维区间到四个数字 Interval2 Components: 分解一个二维区间到独立的一维区间Operators:运算符: Addition: 加法运算 Division: 除法运算 Equality: 等量代换 Larger Than: 比较运算(大于) Modulus: 取模运算 Multiplication: 乘法运算 Power: 乘方运算 Similarity: 近似运算 Smaller Than: 比较运算(小于) Subtraction: 减法运算Polynomials:多项式: Factorial: 阶乘 Log N: 求底数为 N 的对数 Logarithm: 求 10 为底的对数 Natural logarithm: 求以 e 为底的对数 Power of 10: 10 的乘方 Power of 2: 2 的乘方 Power of E: E 的乘方Trig:三角函数: ArcCosine: 反余弦函数 ArcSine: 反正弦函数 ArcTangent: 反正切函数 Cosine: 余弦函数 Sine: 正弦函数 Tangent: 正切函数Util:公用: Mass Addition: 并集运算 Maximum: 取最大值 Mean: 取平均值 Minimum: 取最小值 Truncate:Vector:矢量:Colour: 色彩 Add Colours : 颜色相加 AHSV : 创建一个 HSV 色彩通道(浮点色彩) ARGB : 创建一个 RGB 色彩通道 ARGB Fractional : 创建一个浮点 RGB 色彩通道 Blend Colours : 混合色彩(在两个颜色中取插值) Create Shader : 创建 OpenGL 着色器 Multiply Colours: 色彩倍增 Split AHSV: 将颜色分解为 HSV 通道 Split ARGB: 将颜色分解为 RGB 通道 Subtract Colours: 减去颜色通道Constants: 常数: Unit X : 与 X 轴平行的矢量 Unit Y : 与 Y 轴平行的矢量 Unit Z : 与 Z 轴平行的矢量 XY Plane : XY 平面 XZ Plane : XZ 平面 YZ Plane : YZ 平面Plane:平面: Align Plane : 调整平面(执行最小的旋转调整平面到矢量指向) Align Planes : Plane : 在 XY 平面上创建一个平面 Plane 3Pt : 过三点创建一个平面 Plane Components: 把平面分解到其组成元素 Plane Normal: 创建平面法线 Rotate Plane : 绕 Z 轴旋转平面Point:点: Closest Point: 查找最近点 Decompose : 把点分解到其组成元素 Distance : 计算连个点坐标间的欧几里得距离 Grid Hexagonal : 在每六个点之间生成六边形网格 Grid Rectangular : 在点之间生成矩形网格 Plane CP: 查找离平面最近的点 Point Cylindrical: 在柱面坐标上创建点(角度,半径,标高) Point List: 点列表(显示坐标点的顺序列表) Point Oriented: 通过 UVW 坐标创建点 Point Polar: 在球面坐标上创建点 Point XYZ: 通过 XYZ 坐标创建点 Pull Point: 把点拉至几何体 Text Tag: 在 rhino 视图中创建文字标签 Text Tag 3D: 在 Rhino 视图中创建三维文字标签Vector:矢量: Amplitude : 振幅(设置矢量的振幅) Angle : 角度(计算两个矢量间的夹角) Cross Product : 矢量叉积 Decompose: 把矢量分解到其组成元素 Dot Product: 矢量点积(计算连个矢量的数量积) Multiply: 执行矢量和标量的乘法运算 Reverse: 矢量反向 Summation: 求矢量的和 Unit Vector: Vector 2Pt: 在两点间创建矢量 Vector Length: 计算矢量的振幅 Vector XYZ: 通过 XYZ 创建矢量Curve:曲线:Analysis:分析: Center: 查找圆或圆弧的圆点和半径 Closed: 测试一条曲线是闭合的还是周期性的 Curvature: 曲率(在指定的部位上评估一条曲线的曲率) Curvature Graph: 曲率图表(绘制 Rhino 的曲率图表) Curve CP: 在曲线上查找离指定点最近的点 Curve Frame: 曲线骨架(在指定的部位上得到曲率骨架) Discontinuity: 不连续(沿曲线找出所有不连续点) End Points: 提取曲线端点 Evaluate Curve: 评估曲线(在指定的部位上评估曲线) Evaluate Length: 评估长度(根据长度上一个特定的因子 评估曲线,长度因子可以由曲线单 元和法线单元提供,可以通过改变 N 参数来切换这两种模式) Explode: 炸开(把曲线分解到其组成元素) Horizontal Frame: 水平框架(在曲线上一个特定部位获取一个水平基准的框架) Length: 计算曲线长度 Perp Frame: 垂直框架(在曲线上一个特定部位获取一个垂直基准的框架) Planer: 测试曲线平面性Division:分割: Curve Frames: 生成一系列等距曲线骨架 Divide Curve: 等长度分割曲线 Divide Distance: 用预设距离的点分割曲线 Divide Length: 用预设长度分割曲线 Hortzontal Frames: 产生一系列等位等高的曲线骨架 Perp Frames: 用一系列垂直方向的等位骨架分割曲线 Shatter: 按分段数打碎曲线 Primitive:基本曲线: Arc: 圆弧(由基准面、半径、角度区间决定) Arc 3Pt: 过指定三点的圆弧 Arc SED: SED 圆弧(由起点、终点、切线矢量决定) BiArc: Bi 曲线(由端点和切线决定) Circle : 圆(由指定平面和半径决定) Circle 3Pt: 过三个定点的圆 Circle CNR: CNR 圆(由圆心、旋转轴、半径决定) Ellipse : 椭圆(由指定平面和两个焦点决定) Line : 两点确定的线段 Line SDL : SDL 线段(由起点、正切方向、长度决定) Polygon : 多边形 Rectangle: 矩形Spline:样条曲线: Bezier Span: 贝塞尔曲线 Curve: 控制点曲线 Curve On Surface: 创建一个在指定曲面上的内插点曲线 Interpolate: 内插点曲线 Iso Curve: ISO 曲线(从曲线上提取的 uv 曲线) Kinky Curve: 混合式曲线(贝赛尔角点控制曲线) Poly Arc: 复合弧线(由圆弧和线段拼接而成) Poly Line: 复合线(连接各点组成的折线段) Sub Curve: 子曲线(从一条基本曲线上获得)Util:公用: Fillet: 接触点圆角 Fillet Distance: 断点圆角 Flip: 翻转曲线 Join Curves: 结合曲线 Offset: 偏移曲线 Project: 投射曲线到复合曲面上(BRep 曲面集合,即 Rhino 中的多重曲面)Surface:曲面:Analysis:分析: Box Components: 立方体元素(把立方体分解到其组成元素) Box Corners: 提取立方体角点 BRep Area: 计算 BRep(边界表示)的面积 BRep Components: 把 BRep(边界表示)分解到其组成元素 BRep CP: 在 BRep(边界表示)上查找离指定点最近的点 BRep Volune: 计算 BRep(边界表示)的体积 BRep Wireframe: 提取 BRep(边界表示)物体的线框 Dimensions : 尺寸 Evaluate Box: 在 UVW 空间评估一个立方体 Evaluate Surface: 在 UV 坐标系上评估局部曲面特性 Osc Circles: 圆上接触点(在指定的 UV 坐标系上计算出圆周上和曲面的交点) Principal Curvature: 助率(在指定的 UV 坐标系上计算出曲面的主曲率) Surface CP : 在曲面上查找离指定点最近的点 Surface Curvature: 表面曲率在(指定的 UV 坐标系上计算出曲面的曲率) Trim Inclusion : 测试被修剪部分以内的 UV 点Freeform:自由曲面: 4Point Surface: 由四点创建曲面 Extrude: 沿矢量方向拉伸曲线或曲面 Extrude Linear: 沿笔直路径拉伸曲线或曲面 Extrude Point: 把曲面或曲线拉伸到指定点 Loft: 沿界面曲线方向 Offset: 定量偏移曲面 Pipe: 沿轨道产生管状曲面 Planar Srf: 从一系列边界曲线生成平坦面 Rail Revolution: 通过绕轨道旋转生成曲面 Revolution: 通过旋转生成曲面 Sum Surface: 通过两条边界线生成曲面 Surface From Point: 通过网格点生成 nurbs 曲面 Sweep1 : 单轨扫描曲面 Sweep2 : 双轨扫描曲面 file:///C:\Users\JONES\AppData\Local\Temp\ksohtml\wpsB925.tmp.pngPrimitive:基本曲面: Bounding Box: 边界立方体(边界范围由需要被包含的集合体决定) Box 2Pt: 空间上两点决定的立方体 Box Plane: 创建与一个矩形所在平面相匹配的立方体 Center Box: 在平面的中心点创建立方体 Cone: 圆锥体 Cylinder: 圆柱体 Interval Box: 由基准面和边长创建一个立方体 Plane Srf: 平面 Sphere: 球体Util:公用: Brep Join: 结合 Brep(复合曲面) Cap Holes: 封闭所有 Brep 形(复合曲面)的平面开口 Copy Trim: 复制修剪数据(将 UV 修剪数据从一个曲面复制到另一个) Divide Surface: 产生 UV 网格点分割曲面 Flip: 翻转曲面法线 Isotrim: 等参修剪(在曲面上提取由等参线分割的子集) Retrim: 再修剪(基于其它曲面的三维修剪数据) Surface Frames: 曲面框架(在曲面表面生成 UV 框架网格) Untrim: 撤销修剪(移除曲面上的所有切割线)Mesh:网格面:Primitive:基本网格面: Mesh: 网格面 Mesh Box: 网格面立方体 Mesh Plane: 网格平面 Mesh Quad: 四边形网格 Mesh Sphere: 网格球体 Mesh Triangle: 三角面网格Triangulation:三角细分关系: Mesh BRep: 创建一个与现有 BRep 几何体相似的网格面 Mesh Surface: 网格表面 Settings (Custom): 描绘自定义网格设置 Settings (Quality): 描绘高质量光滑曲面设置 Settings (Speed): 快速描绘不带抗锯齿的曲面设置Util:公用: Face Components: 分解一个单元网格面到其组成元素 Mesh Components: 分解一个网格面到其组成元素 Mesh Paint: 指派一个反复的色彩图案到网格面物体Intersect:交集:Boolean:布尔: Region Difference: 差集(适用于平面闭合曲线) Region Intersection: 交集(适用于平面闭合曲线) Region Union: 并集(适用于平面闭合曲线) Solid Difference: 实体差集(适用于 BRep 形) Solid Intersection: 实体交集(适用于 BRep 形) Solid Union: 实体并集(适用于 BRep 形)Mathematical:数学: BRep | Line: 处理复合曲面和线段的交集问题 BRep | Plane: 处理复合曲面和平面的交集问题(计算剖面) Curve | Line: 处理曲线和线段的交集问题 Curve | Plane: 处理曲线和平面的交集问题 Line | Plane: 处理平面和线段的交集问题 Plane | Plane: 处理平面和平面的交集问题(计算面面交线) Plane | Plane | Plane: 处理三个平面的交集问题 Surface | Line: 处理曲面和线段的交集问题 Physical:物理: BRep | BRep: 处理两个复合曲面的交集问题 BRep | Curve: 处理复合曲面和曲线的交集问题 Curve | Curve: 处理曲线和曲线的交集问题 Surface | Curve: 处理曲面和曲线的交集问题Region:区域: Split with BRep: 用复合曲面分割曲线 Split with BReps: 用多个符合曲面分割曲线 Trim with BRep: 用复合曲面修剪曲线 Trim with BReps: 用多个符合曲面修剪曲线 Trim with Region: 用一个范围修剪曲线 Trim with Regions: 用多个范围修剪曲线XForm:变换:file:///C:\Users\JONES\AppData\Local\Temp\ksohtml\wpsB986.tmp.png Affine:仿射: Orient Direction: 指定方向 Project: 将物体映射到平面 Scale: 缩放物体(所有方向均匀缩放) Scale NU: 非均匀缩放物体 Shear : 扭曲(按矢量扭曲方向扭曲变换物体) Shear Angle: 角度扭曲(按倾斜角度扭曲物体)Euclidian:欧几里得: Mirror: 镜像 Move: 移动 Orient: 转向(将几何体从一个坐标系重映射到另一个坐标系) Rotate: 旋转(在平面内旋转物体) Rotate Axis: 绕轴旋转物体Morph:变形: Blend Box: 在两个平面间建立立方体 Box Morph: 扭曲立方体 Camera Obscura: 针孔照相机 Mirror Curve: 以自由曲线为基准镜像 Mirror Surface: 以自由曲面为基准镜像 Surface Box: 在曲面块上创建扭曲立方体 Surface Morph: 将几何体变形到曲面 UVW 坐标系 Twisted Box: 利用角点创建扭曲立方体Geometry Surface of OpenCascade BRep
Geometry Surface of OpenCascade BRep
摘要Abstract:几何曲面是参数表示的曲面 ,在边界表示中其数据存在于BRep_TFace中,BRep_TFace中不仅包括了几何曲线,还包含用于显示的离散几何信息,如三角剖分数据。本文主要对OpenCascade的BRep表示中几何曲面进行说明,将在后面分析Topology部分的读写程序时来说明包含几何数据的三种拓朴结构中分别包括哪些几何信息。
关键字Key Words:OpenCascade BRep, Geometry Surface, Topology
一、引言 Introduction
边界表示(Boundary Representation)也称为BRep表示,它是几何造型中最成熟、无二义的表示法。实体的边界通常是由面的并集来表示,而每个面又由它所在的曲面的定义加上其边界来表示,面的边界是边的并集,而边又是由点来表示的。
边界表示的一个重要特征是描述形体的信息包括几何信息(Geometry)和拓朴信息(Topology)两个方面。拓朴信息描述形体上的顶点、边、面的连接关系,它形成物体边界表示的“骨架”。形体的几何信息犹如附着在“骨架”上的肌肉。例如,形体的某个面位于某一个曲面上,定义这一曲面方程的数据就是几何信息。此外,边的形状、顶点在三维空间中的位置(点的坐标)等都是几何信息,一般来说,几何信息描述形体的大小、尺寸、位置和形状等。
OpenCascade中几何(Geometry)与拓朴(Topology)的关系也是按上述方式组织的。即几何信息在BRep中并不是单独存在的,而是依附于拓朴存在的。通过继承TopoDS包中的抽象的拓朴类实现了边界表示(BRep)模型。如下图所示:
Figure 1.1 Topology data structure in OpenCascade
从上面的类图可以看出只有三种拓朴对象有几何数据:顶点(vertex)、边(edge)、面(face),分别为BRep_TVertex、BRep_TEdge、BRep_TFace。BRep_TVertex中主要包含一个空间点(x, y, z)数据;几何曲线数据主要存在于BRep_TEdge中,BRep_TEdge中不仅包括了几何曲线,还包含其他类型的几何信息;BRep_TFace中主要包含几何曲面及其他的几何数据,如面的三角剖分等。本文主要对OpenCascade的BRep表示中几何曲面进行说明,将在后面分析Topology部分的读写程序时来说明这三种拓朴结构中分别包括哪些几何信息。
Draw Test Harness是OpenCascade提供的一种灵活和简便的测试与演示OCCT造型库的工具。他不仅可以使用交互的方式来创建、显示和修改曲线、曲面和拓朴形状,还可以以脚本(script)的方式来使用,OpenCascade就是用脚本的方式来对其造型内核进行自动化测试(Tests)。本文将示例程序的几何曲面在Draw Test Harness进行创建与显示,结合图形的直观显示便于对抽象概念的理解。
二、示例程序 Example Code
在OpenCascade提供的文档《BRep Format Description White Paper》对其BRep文件数据进行了说明。BRep文件的几何部分包含了参数曲面,根据文档中提供的数据,利用其提供的类来将示例数据进行输出,再调试其相关代码来分析其实现。示例程序如下所示:
Copyright (c) 2013 eryar All Rights Reserved.
File : Main.cpp
Version : 1.0v
Description : Demonstrate the geometry surface section
of the BRep file of OpenCascade.
KeyWords : OpenCascade, BRep File, Geometry Surface
// OpenCascade library.
#define WNT
#include &Geom_Plane.hxx&
#include &Geom_CylindricalSurface.hxx&
#include &Geom_ConicalSurface.hxx&
#include &Geom_SphericalSurface.hxx&
#include &Geom_ToroidalSurface.hxx&
#include &Geom_SurfaceOfLinearExtrusion.hxx&
#include &Geom_SurfaceOfRevolution.hxx&
#include &Geom_BezierSurface.hxx&
#include &Geom_BSplineSurface.hxx&
#include &Geom_RectangularTrimmedSurface.hxx&
#include &Geom_OffsetSurface.hxx&
#include &TColgp_Array2OfPnt.hxx&
#include &TColStd_Array1OfReal.hxx&
#include &TColStd_Array2OfReal.hxx&
#include &TColStd_Array1OfInteger.hxx&
#include &GeomTools.hxx&
#include &Geom_Circle.hxx&
#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
int main(void)
gp_Ax2 axis(gp_Pnt(1, 2, 3), gp::DZ());
std::ofstream dumpFile("geometrySurface.txt");
// Surface record 1 - Plane.
// Example: 1 0 0 3 0 0 1 1 0 -0 -0 1 0
Handle_Geom_Plane thePlane = new Geom_Plane(gp_Pnt(0, 0, 3), gp_Dir(0, 0, 1));
GeomTools::Write(thePlane, dumpFile);
GeomTools::Dump(thePlane, dumpFile);
GeomTools::Write(thePlane, std::cout);
GeomTools::Dump(thePlane, std::cout);
// Surface record 2 - Cylinder.
// Example: 2 1 2 3 0 0 1 1 0 0 0 1 0 4
Handle_Geom_CylindricalSurface theCylinder = new Geom_CylindricalSurface(axis, 4.0);
GeomTools::Write(theCylinder, dumpFile);
GeomTools::Dump(theCylinder, dumpFile);
GeomTools::Write(theCylinder, std::cout);
GeomTools::Dump(theCylinder, std::cout);
// Surface record 3 - Cone.
// Example: 3 1 2 3 0 0 1 1 0 0 0 1 0 4
Handle_Geom_ConicalSurface theCone = new Geom_ConicalSurface(axis, 0.75, 4.0);
GeomTools::Write(theCone, dumpFile);
GeomTools::Dump(theCone, dumpFile);
GeomTools::Write(theCone, std::cout);
GeomTools::Dump(theCone, std::cout);
// Surface record 4 - Sphere.
// Example: 4 1 2 3 0 0 1 1 0 -0 -0 1 0 4
Handle_Geom_SphericalSurface theSphere = new Geom_SphericalSurface(axis, 4);
GeomTools::Write(theSphere, dumpFile);
GeomTools::Dump(theSphere, dumpFile);
GeomTools::Write(theSphere, std::cout);
GeomTools::Dump(theSphere, std::cout);
// Surface record 5 - Torus.
// Example: 5 1 2 3 0 0 1 1 0 -0 -0 1 0 8 4
Handle_Geom_ToroidalSurface theTorus = new Geom_ToroidalSurface(axis, 8, 4);
GeomTools::Write(theTorus, dumpFile);
GeomTools::Dump(theTorus, dumpFile);
GeomTools::Write(theTorus, std::cout);
GeomTools::Dump(theTorus, std::cout);
// Surface record 6 - Linear Extrusion.
// Example: 6 0 0.6 0.8
2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
Handle_Geom_Circle baseCurve = new Geom_Circle(axis, 4.0);
Handle_Geom_SurfaceOfLinearExtrusion theExtrusion = new Geom_SurfaceOfLinearExtrusion(baseCurve, gp_Dir(0, 0.6, 0.8));
GeomTools::Write(theExtrusion, dumpFile);
GeomTools::Dump(theExtrusion, dumpFile);
GeomTools::Write(theExtrusion, std::cout);
GeomTools::Dump(theExtrusion, std::cout);
// Surface record 7 - Revolution Surface.
// Example: 7 -4 0 3 0 1 0
2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
Handle_Geom_SurfaceOfRevolution theRevolution = new Geom_SurfaceOfRevolution(baseCurve, gp::OY());
theRevolution-&SetLocation(gp_Pnt(-4, 0, 3));
GeomTools::Write(theRevolution, dumpFile);
GeomTools::Dump(theRevolution, dumpFile);
GeomTools::Write(theRevolution, std::cout);
GeomTools::Dump(theRevolution, std::cout);
// Surface record 8 - Bezier Surface.
// Example: 8 1 1 2 1 0 0 1
TColgp_Array2OfPnt poles(1, 3, 1, 2);
TColStd_Array2OfReal weights(1, 3, 1, 2);
poles.SetValue(1, 1, gp_Pnt(0, 0, 1));
weights.SetValue(1, 1, 7.0);
poles.SetValue(1, 2, gp_Pnt(1, 0, -4));
weights.SetValue(1, 2, 10.0);
poles.SetValue(2, 1, gp_Pnt(0, 1, -2));
weights.SetValue(2, 1, 8.0);
poles.SetValue(2, 2, gp_Pnt(1, 1, 5));
weights.SetValue(2, 2, 11.0);
poles.SetValue(3, 1, gp_Pnt(0, 2, 3));
weights.SetValue(3, 1, 9.0);
poles.SetValue(3, 2, gp_Pnt(1, 2, 6));
weights.SetValue(3, 2, 12.0);
Handle_Geom_BezierSurface theBezierSurface = new Geom_BezierSurface(poles, weights);
GeomTools::Write(theBezierSurface, dumpFile);
GeomTools::Dump(theBezierSurface, dumpFile);
GeomTools::Write(theBezierSurface, std::cout);
GeomTools::Dump(theBezierSurface, std::cout);
// Surface record 9 - B-spline Surface.
// Example: 9 1 1 0 0 1 1 3 2 5 4 0 0 1
Standard_Integer uDegree = 1;
Standard_Integer vDegree = 1;
Standard_Boolean uPeriodic = Standard_F
Standard_Boolean vPeriodic = Standard_F
TColStd_Array1OfReal uKnots(1, 5);
TColStd_Array1OfReal vKnots(1, 4);
TColStd_Array1OfInteger uMults(1, 5);
TColStd_Array1OfInteger vMults(1, 4);
uKnots.SetValue(1, 0);
uKnots.SetValue(2, 0.25);
uKnots.SetValue(3, 0.5);
uKnots.SetValue(4, 0.75);
uKnots.SetValue(5, 1.0);
vKnots.SetValue(1, 0);
vKnots.SetValue(2, 0.3);
vKnots.SetValue(3, 0.7);
vKnots.SetValue(4, 1.0);
// Multiplicity of u and v are 1.
uMults.Init(1);
vMults.Init(1);
Handle_Geom_BSplineSurface theBSplineSurface = new Geom_BSplineSurface(poles, weights, uKnots, vKnots, uMults, vMults, uDegree, vDegree, uPeriodic, vPeriodic);
GeomTools::Write(theBSplineSurface, dumpFile);
GeomTools::Dump(theBSplineSurface, dumpFile);
GeomTools::Write(theBSplineSurface, std::cout);
GeomTools::Dump(theBSplineSurface, std::cout);
// Surface record 10 - Rectangular Trim Surface.
// Example: 10 -1 2 -3 4
1 1 2 3 0 0 1 1 0 -0 -0 1 0
Handle_Geom_Plane baseSurface = new Geom_Plane(axis);
Handle_Geom_RectangularTrimmedSurface theTrimmedSurface = new Geom_RectangularTrimmedSurface(baseSurface, -1.0, 2.0, -3.0, 4.0);
GeomTools::Write(theTrimmedSurface, dumpFile);
GeomTools::Dump(theTrimmedSurface, dumpFile);
GeomTools::Write(theTrimmedSurface, std::cout);
GeomTools::Dump(theTrimmedSurface, std::cout);
// Surface record 11 - Offset Surface.
// Example: 11 -2
1 1 2 3 0 0 1 1 0 -0 -0 1 0
Handle_Geom_OffsetSurface theOffsetSurface = new Geom_OffsetSurface(baseSurface, -2.0);
GeomTools::Write(theOffsetSurface, dumpFile);
GeomTools::Dump(theOffsetSurface, dumpFile);
GeomTools::Write(theOffsetSurface, std::cout);
GeomTools::Dump(theOffsetSurface, std::cout);
上述程序将《BRep Format Description White Paper》中的几何部分(Geometry Section)的参数曲面(Surfaces)示例数据分别使用类GeomTools的静态函数输出到屏幕和文件。
当使用GeomTools::Write()时输出的内容与BRep文件中一致,当使用GeomTools::Dump()时输出更易读的信息。为了便于对比理解,将两种形式都输出到文件geometrySurface.txt中,输出数据如下所示:
1 0 0 3 0 0 1 1 0 -0 -0 1 0
Origin :0, 0, 3
2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
CylindricalSurface
Origin :1, 2, 3
3 1 2 3 0 0 1 1 0 -0 -0 1 0 4
ConicalSurface
Origin :1, 2, 3
Angle :0.75
4 1 2 3 0 0 1 1 0 -0 -0 1 0 4
SphericalSurface
Center :1, 2, 3
5 1 2 3 0 0 1 1 0 -0 -0 1 0 8 4
ToroidalSurface
Origin :1, 2, 3
6 0 0.6 0.8
2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
SurfaceOfLinearExtrusion
Direction :0, 0.6, 0.8
Basis curve :
Center :1, 2, 3
7 -4 0 3 0 1 0
2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
SurfaceOfRevolution
Direction :0, 1, 0
Basis curve :
Center :1, 2, 3
8 1 1 2 1 0 0 1
BezierSurface urational vrational
Degrees :2 1
1 : 0, 0, 1
2 : 1, 0, -4
1 : 0, 1, -2
2 : 1, 1, 5
1 : 0, 2, 3
2 : 1, 2, 6
9 1 1 0 0 1 1 3 2 5 4 0 0 1
BSplineSurface urational vrational
Degrees :1 1
NbPoles :3 2
NbKnots :5 4
1 : 0, 0, 1
2 : 1, 0, -4
1 : 0, 1, -2
2 : 1, 1, 5
1 : 0, 2, 3
2 : 1, 2, 6
2 : 0.25 1
4 : 0.75 1
10 -1 2 -3 4
1 1 2 3 0 0 1 1 0 -0 -0 1 0
RectangularTrimmedSurface
Parameters : -1 2 -3 4
BasisSurface :
Origin :1, 2, 3
1 1 2 3 0 0 1 1 0 -0 -0 1 0
OffsetSurface
Offset : -2
BasisSurface :
Origin :1, 2, 3
三、程序说明 Example Description
3.1 平面 Plane
// Surface record 1 - Plane.
// Example: 1 0 0 3 0 0 1 1 0 -0 -0 1 0
Handle_Geom_Plane thePlane = new Geom_Plane(gp_Pnt(0, 0, 3), gp_Dir(0, 0, 1));
GeomTools::Write(thePlane, dumpFile);
GeomTools::Dump(thePlane, dumpFile);
&surface record 1&定义了平面。平面数据包含三维点P和三维正交坐标系N,Du,Dv。平面通过点P,且其法向量为N。其参数方程如下所示:
示例数据表示的平面为通过点P=(0,0,3),法向量N=(0,0,1),其参数方程如下所示:
在Draw Test Harness中创建并显示平面如下所示:
3.2 圆柱面 Cylinder
// Surface record 2 - Cylinder.
// Example: 2 1 2 3 0 0 1 1 0 0 0 1 0 4
Handle_Geom_CylindricalSurface theCylinder = new Geom_CylindricalSurface(axis, 4.0);
GeomTools::Write(theCylinder, dumpFile);
GeomTools::Dump(theCylinder, dumpFile);
&surface record 2&定义了圆柱面。圆柱面的数据包含三维点P,三维正交坐标系Dv,Dx,Dy和一个非负实数r。圆柱面的轴通过点P,方向为Dv,圆柱面的半径为r,其参数方程如下所示:
示例数据表示的圆柱面为轴通过点P=(1,2,3),轴的方向Dv=(0,0,1),方向Dx=(1,0,-0),Dy=(-0,1,0),半径r=4,其参数方程如下所示:
在Draw Test Harness中创建并显示圆柱面如下所示:
3.3 圆锥面 Cone
// Surface record 3 - Cone.
// Example: 3 1 2 3 0 0 1 1 0 0 0 1 0 4
Handle_Geom_ConicalSurface theCone = new Geom_ConicalSurface(axis, 0.75, 4.0);
GeomTools::Write(theCone, dumpFile);
GeomTools::Dump(theCone, dumpFile);
&surface record 3&定义了圆锥面。圆锥面的数据包含三维点P,正交坐标系Dz,Dx,Dy,非负实数r和实数ψ(范围为(-π/2, π/2))。圆锥面通过点P且轴的方向为Dz。过点P且与方向Dx,Dy平行的平面为圆锥面的参考平面(referenced plane)。参考平面截圆锥面为一个圆,其半径为r。其参数方程如下所示:
示例数据表示的圆锥面的轴通过点P=(1,2,3),方向Dz=(0,0,1)。圆锥面的其他数据是Dx=(1,0,-0),Dy=(-0,1,0),半径r=4,角度ψ=0.75。其参数方程如下所示:
在Draw Test Harness中创建并显示圆锥面如下所示:
3.4 球面 Sphere
// Surface record 4 - Sphere.
// Example: 4 1 2 3 0 0 1 1 0 -0 -0 1 0 4
Handle_Geom_SphericalSurface theSphere = new Geom_SphericalSurface(axis, 4);
GeomTools::Write(theSphere, dumpFile);
GeomTools::Dump(theSphere, dumpFile);
&surface record 4&定义了球面。球面的数据包含三维点P,三维正交坐标系Dz,Dx,Dy和非负实数r。即球面的球心为点P,半径为r,其参数方程如下所示:
示例数据表示的球面为球心过点P=(1,2,3),方向分别为Dz=(0,0,1),Dx=(1,0,-0),Dy=(-0,1,0),半径r=4。其参数方程如下所示:
在Draw Test Harness中创建并显示球面如下所示:
3.5 圆环面 Torus
// Surface record 5 - Torus.
// Example: 5 1 2 3 0 0 1 1 0 -0 -0 1 0 8 4
Handle_Geom_ToroidalSurface theTorus = new Geom_ToroidalSurface(axis, 8, 4);
GeomTools::Write(theTorus, dumpFile);
GeomTools::Dump(theTorus, dumpFile);
&surface record 5&定义了圆环面。圆环面的数据包含三维点P,三维正交坐标系Dz,Dx,Dy和非负实数r1,r2。圆环面的轴通过点P,方向为Dz,r1是从圆环面的圆的中心到点P的距离,圆环面的圆的半径为r2。圆环面的参数方程如下所示:
示例数据表示的圆环面的轴通过点P=(1,2,3),轴的方向为Dz=(0,0,1)。其它数据为Dx=(1,0,-0),Dy=(0,1,0),r1=8,r2=4,其参数方程如下所示:
在Draw Test Harness中创建并显示圆环面如下所示:
3.6 线性拉伸面 Linear Extrusion
// Surface record 6 - Linear Extrusion.
// Example: 6 0 0.6 0.8
2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
Handle_Geom_Circle baseCurve = new Geom_Circle(axis, 4.0);
Handle_Geom_SurfaceOfLinearExtrusion theExtrusion = new Geom_SurfaceOfLinearExtrusion(baseCurve, gp_Dir(0, 0.6, 0.8));
GeomTools::Write(theExtrusion, dumpFile);
GeomTools::Dump(theExtrusion, dumpFile);
&surface record 6&定义了线性拉伸面。线性拉伸面的数据包含三维方向Dv和三维曲线&3D curve record&。其参数方程如下所示:
示例数据表示的线性拉伸面的拉伸方向Dv=(0,0.6,0.8),拉伸曲线为圆。拉伸面的参数方程如下所示:
在Draw Test Harness中创建并显示线性拉伸面如下所示:
3.7 旋转面 Revolution Surface
// Surface record 7 - Revolution Surface.
// Example: 7 -4 0 3 0 1 0
2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
Handle_Geom_SurfaceOfRevolution theRevolution = new Geom_SurfaceOfRevolution(baseCurve, gp::OY());
theRevolution-&SetLocation(gp_Pnt(-4, 0, 3));
GeomTools::Write(theRevolution, dumpFile);
GeomTools::Dump(theRevolution, dumpFile);
&surface record 7&定义了旋转面。旋转面的数据包含三维点P,三维方向D和三维曲线。旋转曲面的轴通过点P且方向为D,旋转曲线为C与旋转轴共面。旋转曲面的参数方程如下所示:
示例数据表示的旋转曲面的旋转轴通过点P=(-4,0,3),方向D=(0,1,0),旋转曲线是一个圆。其参数方程如下所示:
在Draw Test Harness中创建并显示旋转面如下所示:
3.8 Bezier曲面 Bezier Surface
// Surface record 8 - Bezier Surface.
// Example: 8 1 1 2 1 0 0 1
TColgp_Array2OfPnt poles(1, 3, 1, 2);
TColStd_Array2OfReal weights(1, 3, 1, 2);
poles.SetValue(1, 1, gp_Pnt(0, 0, 1));
weights.SetValue(1, 1, 7.0);
poles.SetValue(1, 2, gp_Pnt(1, 0, -4));
weights.SetValue(1, 2, 10.0);
poles.SetValue(2, 1, gp_Pnt(0, 1, -2));
weights.SetValue(2, 1, 8.0);
poles.SetValue(2, 2, gp_Pnt(1, 1, 5));
weights.SetValue(2, 2, 11.0);
poles.SetValue(3, 1, gp_Pnt(0, 2, 3));
weights.SetValue(3, 1, 9.0);
poles.SetValue(3, 2, gp_Pnt(1, 2, 6));
weights.SetValue(3, 2, 12.0);
Handle_Geom_BezierSurface theBezierSurface = new Geom_BezierSurface(poles, weights);
GeomTools::Write(theBezierSurface, dumpFile);
GeomTools::Dump(theBezierSurface, dumpFile);
&surface record 8&定义了Bezier曲面。曲面的数据包含u有理标志位ru,v有理标志位rv,曲面次数mu, mv,和weight poles。u,v的次数都不能大于25。
当ru+rv=0时,weight poles是(mu+1)(mv+1)个三维点Bi,j((i,j)∈{0,...,mu}x{0,...,mv}),hi,j=1((i,j)∈{0,...,mu}x{0,...,mv});
当ru+rv≠0时,weight poles是(mu+1)(mv+1)个带权控制点对Bi,j,hi,j。Bi,j是三维点,hi,j是权因子,正实数。
Bezier曲面的参数方程如下所示:
示例数据表示的Bezier曲面为:u有理标志位ru=1,v有理标志位rv=1,次数mu=2,mv=1,weight poles为:B0,0=(0,0,1),h0,0=7,B0,1=(1,0,-4),h0,1=10,B1,0=(0,1,-2),h1,0=8,B1,1=(1,1,5),h1,1=11,B2,0=(0,2,3),h2,0=9,B2,1=(1,2,6),h2,1=12。曲面的参数方程为:
在Draw Test Harness中创建并显示Bezier曲面如下所示:
3.9 B样条曲面 B-spline Surface
// Surface record 9 - B-spline Surface.
// Example: 9 1 1 0 0 1 1 3 2 5 4 0 0 1
Standard_Integer uDegree = 1;
Standard_Integer vDegree = 1;
Standard_Boolean uPeriodic = Standard_F
Standard_Boolean vPeriodic = Standard_F
TColStd_Array1OfReal uKnots(1, 5);
TColStd_Array1OfReal vKnots(1, 4);
TColStd_Array1OfInteger uMults(1, 5);
TColStd_Array1OfInteger vMults(1, 4);
uKnots.SetValue(1, 0);
uKnots.SetValue(2, 0.25);
uKnots.SetValue(3, 0.5);
uKnots.SetValue(4, 0.75);
uKnots.SetValue(5, 1.0);
vKnots.SetValue(1, 0);
vKnots.SetValue(2, 0.3);
vKnots.SetValue(3, 0.7);
vKnots.SetValue(4, 1.0);
// Multiplicity of u and v are 1.
uMults.Init(1);
vMults.Init(1);
Handle_Geom_BSplineSurface theBSplineSurface = new Geom_BSplineSurface(poles, weights, uKnots, vKnots, uMults, vMults, uDegree, vDegree, uPeriodic, vPeriodic);
GeomTools::Write(theBSplineSurface, dumpFile);
GeomTools::Dump(theBSplineSurface, dumpFile);
&surface record 9&定义了B-Spline曲面。B样条曲面数据包含u有理标志位ru,v有理标志位rv,u次数mu&=25;v次数mv&=25,u控制点数nu&=2,v控制点数nv&=2,u重节点数ku,v重节点数kn,weight poles,u重节点,v重节点。
当ru+rv=0时,weight poles是(mu+1)(mv+1)个三维点Bi,j((i,j)∈{0,...,mu}x{0,...,mv}),hi,j=1((i,j)∈{0,...,mu}x{0,...,mv});
当ru+rv≠0时,weight poles是(mu+1)(mv+1)个带权控制点对Bi,j,hi,j。Bi,j是三维点,hi,j是权因子,正实数。
u重节点及其重数有ku对:u1,q1,...,uku,qku。这里ui是重数为qi&=1的节点:
v重节点及其重数有kv对:u1,q1,...,ukv,qkv。这里vi是重数为qi&=1的节点:
B-Spline曲面的参数方程如下所示:
基函数Ni,j和Mi,j有如下的递归定义:
示例数据表示的B-Spline曲面为:u有理标志位ru=1,v有理标志位rv=1,u次数mu=1,v次数mv=1,u控制点数nu=3,v控制点数nv=2,u有重复度的节点数ku=5,v有重复度节点数kv=4,带权控制点B1,1=(0,0,1),h1,1=7,B1,2=(1,0,-4),h1,2=10,B2,1=(0,1,-2),h2,1=8,B2,2=(1,1,5),h2,2=11,B3,1=(0,2,3),h3,1=9,B3,2=(1,2,6),h3,2=12,u有重复度节点u1=0,q1=1,u2=0.25,q2=1,u3=0.5,q3=1,u4=0.75,q4=1,u5=1,q5=1,v有重度度节点v1=0,r1=1,v2=0.3,r2=1,v3=0.7,r3=1,v4=1,r4=1。B-Spline曲面的参数方程如下所示:
在Draw Test Harness中创建并显示B样条曲面如下所示:
3.10 矩形裁剪曲面 Rectangular Trim Surface
// Surface record 10 - Rectangular Trim Surface.
// Example: 10 -1 2 -3 4
1 1 2 3 0 0 1 1 0 -0 -0 1 0
Handle_Geom_Plane baseSurface = new Geom_Plane(axis);
Handle_Geom_RectangularTrimmedSurface theTrimmedSurface = new Geom_RectangularTrimmedSurface(baseSurface, -1.0, 2.0, -3.0, 4.0);
GeomTools::Write(theTrimmedSurface, dumpFile);
GeomTools::Dump(theTrimmedSurface, dumpFile);
&surface record 10&定义了矩形裁剪曲面。矩形裁剪曲面的数据包含实数umin,umax,vmin,vmax和一个曲面。矩形裁剪曲面是将曲面限制在矩形区域[umin,umax]x[vmin,vmax]内得到的曲面。曲面的参数方程如下所示:
示例数据表示的矩形裁剪曲面的矩形裁剪区域为[-1,2]x[-3,4],被裁剪曲面B(u,v)=(1,2,3)+u(1,0,0)+v(0,1,0)。其参数方程如下所示:
在Draw Test Harness中创建并显示矩形裁剪曲面如下所示:
3.11 偏移曲面 Offset Surface
// Surface record 11 - Offset Surface.
// Example: 11 -2
1 1 2 3 0 0 1 1 0 -0 -0 1 0
Handle_Geom_OffsetSurface theOffsetSurface = new Geom_OffsetSurface(baseSurface, -2.0);
GeomTools::Write(theOffsetSurface, dumpFile);
GeomTools::Dump(theOffsetSurface, dumpFile);
&surface record 11&定义了偏移曲面。偏移曲面的数据包含偏移距离d和曲面。偏移曲面的就将基准曲面B没曲面的法向N上偏移距离d得到的曲面。偏移曲面的参数方程如下所示:
示例数据表示的偏移曲面的偏移距离d=-2,基准曲面B(u,v)=(1,2,3)+u(1,0,0)+v(0,1,0)。其参数方程如下所示:
在Draw Test Harness中创建并显示偏移曲面如下所示:
注:当偏移-2时,效果不明显示,所以偏移了-20,这样看上去比较明显。
四、程序分析 Refactoring the Code
Figure 4.1 Class diagram of Geom_Surface
根据几何曲面的类图可知,几何曲面有个共同的基类Geom_Surface。而在对几何数据进行输出与读入时,用了很多条件判断。输出部分程序代码如下所示:
//=======================================================================
//function : PrintSurface
//=======================================================================
void GeomTools_SurfaceSet::PrintSurface(const Handle(Geom_Surface)& S,
Standard_OStream& OS,
const Standard_Boolean compact)
Handle(Standard_Type) TheType = S-&DynamicType();
if ( TheType ==
STANDARD_TYPE(Geom_Plane)) {
Print(Handle(Geom_Plane)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_CylindricalSurface)) {
Print(Handle(Geom_CylindricalSurface)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_ConicalSurface)) {
Print(Handle(Geom_ConicalSurface)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_SphericalSurface)) {
Print(Handle(Geom_SphericalSurface)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_ToroidalSurface)) {
Print(Handle(Geom_ToroidalSurface)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) {
Print(Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_SurfaceOfRevolution)) {
Print(Handle(Geom_SurfaceOfRevolution)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_BezierSurface)) {
Print(Handle(Geom_BezierSurface)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_BSplineSurface)) {
Print(Handle(Geom_BSplineSurface)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
Print(Handle(Geom_RectangularTrimmedSurface)::DownCast(S),OS,compact);
else if ( TheType ==
STANDARD_TYPE(Geom_OffsetSurface)) {
Print(Handle(Geom_OffsetSurface)::DownCast(S),OS,compact);
GeomTools::GetUndefinedTypeHandler()-&PrintSurface(S,OS,compact);
//if (!compact)
OS && "***** Unknown Surface ********\n";
cout && "***** Unknown Surface ********"&&
读入部分的程序代码如下所示:
//=======================================================================
//function : ReadSurface
//=======================================================================
Standard_IStream& GeomTools_SurfaceSet::ReadSurface(Standard_IStream& IS,
Handle(Geom_Surface)& S)
Standard_I
OCC_CATCH_SIGNALS
switch (stype) {
case PLANE :
Handle(Geom_Plane) SS;
case CYLINDER :
Handle(Geom_CylindricalSurface) SS;
case CONE :
Handle(Geom_ConicalSurface) SS;
case SPHERE :
Handle(Geom_SphericalSurface) SS;
case TORUS :
Handle(Geom_ToroidalSurface) SS;
case LINEAREXTRUSION :
Handle(Geom_SurfaceOfLinearExtrusion) SS;
case REVOLUTION :
Handle(Geom_SurfaceOfRevolution) SS;
case BEZIER :
Handle(Geom_BezierSurface) SS;
case BSPLINE :
Handle(Geom_BSplineSurface) SS;
case RECTANGULAR :
Handle(Geom_RectangularTrimmedSurface) SS;
case OFFSET :
Handle(Geom_OffsetSurface) SS;
Handle(Geom_Surface) SS;
GeomTools::GetUndefinedTypeHandler()-&ReadSurface(stype,IS,SS);
catch(Standard_Failure) {
#ifdef DEB
Handle(Standard_Failure) anExc = Standard_Failure::Caught();
cout &&"EXCEPTION in GeomTools_SurfaceSet::ReadSurface(..)!!!" &&
cout && anExc &&
return IS;
正如《Refactoring-Improving the Design of Existing Code》书中以多态取代条件表达式(Replace Conditional with Polymorphism)所说,在面向对象术语中,听上去最高贵的词非“多态”莫属。多态最根本的好处就是如果你需要根据对象的不同类型而采取不同的行为,多态使你不必编写明显的条件表达式。正因为有了多态,所以你会发现“类型码的switch语句”以及“基于类型名称的if-then-else语句”在面向对象程序中很少出现。
多态能够带给你很多好处。如果同一组条件表达式在程序许多地方出现,那么使用多态的收益是最大的。使用条件表达式时,如果你想添加一种新类型,就必须查找并更新所有条件表达式。但如果改用多态,只需要一个新的子类,并在其中提供适当的函数就行了。类的用户不需要了解这个子类,这就大降低了系统各部分之间的依赖,使系统升级更容易。
OpenCascade的几何曲面已经有一个基类Geom_Surface了,可将输出做为虚函数,就不需要做判断了。在读入(创建)时引入工厂模式,对于UndefinedTypeHandler()可以引入Null对象。经过这样重构之后的程序可读性应该会更好吧!
五、结论 Conclusion
在边界表示BRep的形状中,参数表示的几何曲面并不会孤立存在,他总是依附于拓朴面中。在OpenCascade的BRep格式的文件中三维几何曲面共有十一种,通过将这十一种几何曲面输出,理解参数表示的几何曲面的数据结构。
通过查看其读写几何曲面的源程序,提出重构的方法。当在面向对象的程序中出现很条件表达式时,那么程序就有“坏味道”了,需要进行重构改进。
六、参考资料 References
1. OpenCascade. BRep Format Description White Paper
2. Martin Fowler. Refactoring:Improving the Design of Existing Code. Addison-Wesley
3. Les Piegl, Wayne Tiller. The NURBS Book. Springer-Verlag
PDF Version:
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.061 (s). 13 q(s)}

我要回帖

更多关于 一般纳税人和小规模纳税人的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信