华科大CAD技术及应用基础课件第5讲 几何建模技术_第1页
华科大CAD技术及应用基础课件第5讲 几何建模技术_第2页
华科大CAD技术及应用基础课件第5讲 几何建模技术_第3页
华科大CAD技术及应用基础课件第5讲 几何建模技术_第4页
华科大CAD技术及应用基础课件第5讲 几何建模技术_第5页
已阅读5页,还剩124页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5讲几何建模技术

黄运保

华中科技大学CAD中心

几何造型技术是研究在计算机中,如何表达物体模型形状的技术。几何造型通过对点、线、面、体等几何元素的数学描述,经过平移、旋转、变比等几何变换和并、交、差等集合运算,产生实际的或想象的物体模型。

几何造型技术概述主要内容:

本章目的1.了解计算机内部是怎样表达三维机械零部件模型2.了解几何形体CSG、BREP表达的基本原理3.了解几何形体的其它表达方法1.几何形体的计算机内部表达2.几何形体的CSG、Brep表达3.几何形体的其它表达方法几何形体的计算机内部表达计算机中表示形体,通常用线框模型、表面模型和实体模型。线框模型和表面模型保存的三维形体信息都不完整。只有实体模型才能够完整地、无歧义地表示三维形体。

在实体模型的表示中,出现了许多方法,基本上可以分为空间分解表示(单元枚举、八叉树分解、单元分解等)、构造表示(CSG)和边界表示(BREP)三大类。构造表示是按照生成过程来定义形体的方法,构造表示通常有扫描表示、构造实体几何表示和特征表示三种。点用三维坐标表示,是最基本的元素边是形体相邻面的交界,可为空间直线或曲线环是有序、有向的封闭边界,外环仅一个,逆时针方向,内环可有可无,也可多个,方向顺时针。面是一个单连通区域,可以是平面或曲面,由一个外环和若干个内环组成;面的方向由面的法矢决定,法矢向外为正向面。基本概念及定义实体是由若干个面组成的闭集,实体的边界是有限个面的集合。形体表面上任一点的足够小的邻域在拓扑上应是一个等价的封闭圆,即围绕该点的形体邻域在二维空间中可构成一个单连通域,我们把满足该定义的形体称为正则形体。否则为非正则形体,如存在悬面、悬边的长方体为非正则形体。

基本概念及定义1.线框模型线框模型用顶点和棱边表示三维形体,其棱边可以为直线、圆弧、二次曲线及样条曲线组成。线框模型在计算机内存储的数据结构:顶点表:记录各顶点坐标值;棱线表:记录每条棱线所连接的顶点及走向。classPOINTclassEDGE{{doublev[3];//坐标值intstart_point_no;//边的起点intpointtype;//点的属性intend_point_no;//边的终点

CURVEcur;//边方程定义;

…………..

…………..}}以立方体为例,其线框模型结构如下表:81.线框模型优点结构简单,计算机内部易于表达,绘制快速;物体的三维数据可以产生任意视图,为生成工程图带来了方便缺点有二义性,缺少表面轮廓信息,当形状复杂、棱线过多时,会引起模糊理解。2.在数据结构中缺少边与面、面与体之间关系的信息。从原理上讲,此种模型不能消除隐藏线、计算物性、生成数控加工刀具轨迹、有限元网格剖分、物体干涉检验等。1.线框模型2.表面模型表面模型是用有连接顺序的棱边围成的有限区域来定义形体的表面,再由表面的集合来定义形体。表面可以是平面,也可以是柱面、球面等类型的二次曲面,也可是样条曲面构成的自由曲面。表面模型是在线框模型的基础上,增加有关面边信息以及表面特征、棱边的连接方向等内容。表面模型存储几何信息的方法是建立三表结构,即顶点表、边表和面表。1)顶点坐标值存放在顶点表中;

2)含有指向顶点表指针的边表,用来为多边形的每条边标识顶点;边有方向,从起点到终点为正方向;

3)面表有指向边表的指针,用来为每个表面标识其组成边。2.表面模型classPOINTclassEDGEclassFACE{{{

同线框模型同线框模型intedge_num;//边数

int*edge_no;//边链表

intface_type;//面类型

SURFACEsur;//面方程

………….………….…………….}}}2.表面模型表面模型唯一没有解决的问题是形体究竟在表面的哪一侧,因而在物性计算、有限元分析等应用中,表面模型在形体的表示上仍然缺乏完整性。表面模型可以满足面面求交,线面消隐、明暗处理和数控加工的要求。优点:2.表面模型缺点:3.实体模型为了解决形体存在于表面的哪一侧的问题,可采用实体模型来描述三维立体在表面模型的基础上可用三种方法来定义表面的哪一侧存在实体。1)给出实体存在一侧的一点;2)直接用表面的外法矢来指明实体存在的一侧;3)用有向棱边隐含地表示表面的外法矢方向,该方法为CAD系统广泛采用。

(思考:为什么不直接用法矢?)classPOINTclassEDGEclassFACE{{{

同线框模型同线框模型intedge_num;//边数

EDGE*edge;//边链表

intface_type;//面类型

SURFACEsur;//面方程

………….………….………….}}}数据结构如下:用有向棱边隐含地表示表面的外法矢方向时,规定有向棱边按右手法则取向:沿着闭合的棱边所得的方向与表面外法矢方向一致。3.实体模型

有矛盾,CAD系统中增加“环”的定义解决矛盾classPOINTclassLOOPclassFACE{{{

同线框模型intlop_typ;//环类型intloop_num;//环数………int*eno;//边索引

LOOP*lop;//环链表}LOOP*nxt;//下一环intface_type;//面类型classEDGE

………….

SURFACEsur;//面方程{同线框模型}………….………}}用“+、-”标识边的方向改进的数据结构如下:思考:相邻两个面的公共棱边的方向不会矛盾吗?3.实体模型根据实体模型,可以进行物性计算(如体积、质量,惯量)、有限元分析等应用。从前面的实体模型可知,本质上我们仍然采用形体的边界表面的数学描述代替实体描述。这种典型的描述方法通常称为实体的边界表达方法(BREP)实体模型的特点3.实体模型4.线框、表面与实体模型的比较模型表示应用范围局限性二维线框画二维线框图(工程图)无法观察参数的变化,不可能产生有实际意义的形体三维线框画二、三维线框图不能表示实体、图形会有二义性表面模型艺术图形、形体表面的显示、数控加工不能表示实体实体模型物性计算、有限元分析用集合运算构造形体只能产生正则形体抽象形体的层次较低1.几何形体的计算机内部表达2.几何形体的CSG、Brep表达3.几何形体的其它表达方法主要内容实体模型边界表达(Brep)边界表示(BoundaryRepresentation,缩写Brep)通过描述实体的边界来表示实体。实体的边界将该实体分为实体内点集和实体外点集,是实体与环境之间的分界面。定义了实体的边界,实体就被唯一定义,如右图所示。边界表示是用一组曲面(或平面)来描述三维物体,这些曲面(或平面)将物体分为内部和外部。典型例子是平面立体表示和曲面表示的立体。

实体的边界通常是由面的并集来表示,而每个面又由它的数学定义加上其边界来表示,面的边界是环边的并集,而边又是由点来表示的。点用三维坐标表示,是最基本的元素边是相邻面的交界,可为有向空间直线或曲线环是由有序、有向的边组成的封闭边界,环有内、外环之分,外环最大且只有一个,内环的方向和外环相反。面是一个单连通区域,可以是平面或曲面,由外环和若干个内环组成;面的方向用垂直于面的法矢表示,法矢向外为正向面。实体是由若干个面组成的闭包,实体的边界是有限个面的集合。形体表面上任一点的足够小的邻域在拓扑上应是一个等价的封闭圆,即围绕该点的形体邻域在二维空间中可构成一个单连通域,我们把满足该定义的形体称为正则形体。否则为非正则形体,如存在悬面、悬边的长方体为非正则形体。

边界表达(BREP)一类是几何信息。描述形体的大小、位置、形状等基本信息,如顶点坐标,边和面的数学表达式等。另一类是拓扑信息。拓扑信息描述形体上的顶点、边、面的连接关系。拓扑信息形成物体边界表示的“骨架”,形体的几何信息犹如附着在“骨架”上的“肌肉”。在Brep中,拓扑信息是指用来说明体、面、边及顶点之间连接关系的这一类信息,例如面与哪些面相邻;面由那些边组成等。

描述形体拓扑信息的根本目的是便于直接对构成形体的各面、边及顶点的参数和属性进行存取和查询,便于实现以面、边、点为基础的各种几何运算和操作。例如:多面体的面、边和顶点间的九种拓扑关系面面邻接关系面上点的关系面上边的关系点与面连接关系点点连接关系点与边连接关系边面邻接关系边点连接关系边边连接关系在这九种不同类型的拓扑关系中,有些关系冗余,因此计算机内部并不需要所有拓扑关系都直接表达。但至少需表达两种以上拓扑关系才能构成一个实体完全的拓扑信息。

存储更多的拓扑关系,花费的代价是存储量大了,以冗余来换计算工作量的节省和某些算法的易于实现。

例如,在Brep表达中,简单实体的数据结构可用体、面、边、点四个层次的表描述

对复杂实体的数据结构则采用更多的层次表来描述边界表达强调实体的外表细节,把面、边、顶点的信息分层描述,并建立了层与层之间边界表示。没有统一的数据结构,为了有效地表示几何体的拓扑关系,斯坦福大学B.G.Baumgart在1972年提出的以棱边为中心的多面体表示的翼边结构(WingedEdgeDataStructure,WED)及改进后的对称结构等。Brep数据结构翼边结构以边为核心组织数据,如图:棱边数据结构中包含两个点指针,指向该边的起点和终点,棱边为一有向线段。当棱边为曲线段时,还需增加一指针指向曲线表示的结构。现在的CAD系统数据结构都是翼边结构的变种XYbdeca12WED中另设两个环指针,分别指向棱边所邻接的两个面(左面和右面)。为了从棱边搜索到它所在的任一面上的其它棱边,数据结构中还增设四个指向邻边的指针,分别为左上边、左下边、右上边、右下边,左上边为棱边左边环中沿逆时针方向所连接的下一条边,其余类推。WED拓扑信息完整,查询修改方便,可很好应用于正则布尔运算Brep数据结构fXYbdeca12dbcefeacbacedcbdeaaffbeddfbcBrep数据结构举例Brep数据结构举例Brep数据结构举例Brep数据结构举例Brep数据结构举例Brep数据结构举例Brep数据结构举例边的方向定义后,其左右外环、左右面的连接关系唯一确定(右手法则),如右图:环是由有序、有向的边组成的封闭边界,按右手法则,外环逆时针方向(确定面的外法矢方向),内环顺时针。面可以是平面或曲面,由一个外环和若干内环组成;法矢向外为正向面(由外环方向确定,确保指向实体外侧)。先对点、边、环、面进行编号,编号顺序自定,但最好有利于编程实现;边的方向自定。左外环左面右外环右面Brep数据结构填表Brep数据结构优点:(1)表示形体的点、线、面等几何元素是显式表示、使得形体的显示很快并且很容易确定几何元素之间的连接关系;(2)可对Brep法的形体进行多种操作和局部修改缺点:(1)数据结构复杂,需要大量存储空间,维护内部数据结构及一致性的程序较复杂;(2)对形体的修改操作较难实现。Brep特点构造实体几何表示方法(CSG)构造实体几何表示(ConstructiveSolidGeometry,缩写为CSG)的含义是任何复杂的形体都可用简单形体通过正则集合运算组合,并配合几何变换来表示。在1977年由罗切斯特(Rochester)大学的Voelcker和Requicha等人首先提出。

CSG中物体形状的定义以集合论为基础,先定义集合本身,其次是集合之间运算。所以,CSG表示先定义有界体素(如立方体、圆柱、球、锥、圆环等),然后将这些体素进行并、交、差运算A体B体A+*

BA-*

BA∩*B构造实体几何表示方法(CSG)形体的CSG可看成是一个有序的二叉树,其叶子节点是体素或几何变换的参数,非叶节点则是布尔运算的操作符或几何变换操作。任何子树表示其下两个节点的组合或变换的结果,树根表示最终的形体。

运算规则(前序遍历):自上而下,自左而右-*U*P1P2平移P3△X构造实体几何表示方法(CSG)用CSG树表示一个形体是无二义性的,但一个形体可以有不同的CSG树表示,取决于使用的体素、构造操作方法和操作顺序。

CSG表示依赖稳定可靠的布尔运算算法支撑。优点:(1)数据结构比较简单,信息量小,易于管理;(2)每个CSG都和一个实际的有效形体相对应;(3)CSG树记录了形体的生成过程,可修改形体生成各环节以改变形体的形状。缺点:(1)不能进行形体的局部修改,如面、边、点等;(2)直接基于CSG表达形体,其组合运算及显示效率很低。

构造实体几何表示方法(CSG)CSG+Brep混合表示从用户进行造型的角度看,CSG方法比较方便,从对形体的存储管理和操作角度看,Brep法更为实用。目前大多数CAD系统都以CSG+Brep的混合表示作为形体数据表示的基础:以CSG模型表示几何造型的特征历史过程及其特征设计参数;用Brep模型维护详细的几何信息和显示、查询等操作,同时也为布尔运算提供基础。主要内容:

1.几何形体的计算机内部表达2.几何形体的CSG、Brep表达3.几何形体的其它表达方法空间分割表示将形体按某种规则分解为小的更易于描述的部分,每一小部分又可分为更小的部分,这种分解过程直至每一小部分都能够直接描述为止。空间位置枚举表示八叉树表示其它表达方法(略)1.空间位置枚举表示空间位置枚举法是一种穷举表示法,它可以用来表示任何物体,通常情况下,它只是物体的近似表示。当立方体被物体所占据时,取值为1,否则为0。这样,三维数组就唯一表示了包含于立方体之内的物体。优点:采用这种表示很容易实现物体的集合运算以及计算物体的诸如体积等的许多整体性质。缺点:如果没有明确给出物体的边界信息,不适于图形显示,并且它占据的存储量非常大。2.八叉树表示八叉树表示法对空间位置枚举法中的空间分割方法做了改进,它并不是统一将物体所在的立方体空间均匀划分成边长相等的小立方体,而是对空间进行自适应划分,采用具有层次结构的八叉树来表示物体。三维形体的八叉树表示类似于二维图形的四叉树表示。八叉树表示在形体三角剖分,动画的干涉检验中经常采用(多数情况下作为临时数据结构生成以便实现某种特定算法)为描述简单起见,以四叉树表示为例,在一个包含二维图形的正方形区域中考虑问题。这个正方形区域就是四叉树的根节点,它可能处于三种状态:完全被图形覆盖、部分被覆盖或完全没有被覆盖,分别以F,P和E标识。若根节点处于状态F或E,则四叉树建立完毕;否则,将其划分为四个小正方形区域,分别标以编码0,1,2,3,这四个小正方形区域就成了第一层子节点,对它们做类似于根节点的处理。如此下去,直至建立图形的四叉树表示。2.八叉树表示类似于四叉树方法,对图形进行八叉树表示2.八叉树表示优点:容易实现实体之间的正则集合运算。容易计算实体的整体性质,如质量,体积等。容易实现隐藏线与隐藏面的消除。缺点:它通常不能精确表示一个实体,对八叉树表示的实体做任意的几何变换也比较困难。如旋转角度非90°倍数的旋转变换,放缩的比例非2的倍数的放缩变换。尽管采用了自适应空间分割,八叉树表示仍然需要较大的存储空间2.八叉树表示-特点思考题:1.常用CAD的内部表达模型有几种,各自特点如何?2.CAD系统中CSG和BREP表达原理及特点3.掌握Brep表达的数据结构及实现过程第6讲几何形体定义布尔运算

1.几何形体定义方法2.布尔运算基本原理1常见几何形体定义方法对CAD系统来说,形体定义就是用少量的参数描述几何形体的大小、形状和位置。几何造型系统的优劣首先取决于是否提供好的形体定义能力,除了要有良好的用户界面以外,还需提供多种造型方法,这样不仅能扩大造型系统的几何覆盖率,而且能提高工程师的设计效率。常用几类形体输入方法:

1)基本体素法2)扫描变换法

3)局部操作4)特征表示对于设计师而言,所关心的是如何快捷、方便地设计一个满足需求的零件结构(即零件形体)。1.1基本体素法常用的基本体素有方盒、锥、柱、球、环等绝大多数商用CAD系统都提供该功能,尤其是游戏系统应用更广泛。用户仅需输入一些简单的参数便可以定义这些体素的大小、形状和位置。因此商用系统提供自定义体素功能,为用户定义专用的特征库提供方便。值得注意的是:用户仅需按提示交互定义(对话框或简单草图)形体,计算机内部用CSG表达记录定义参数及历史,同时自动生成定义形体的BREP表达模型。1.2

扫描变换法

扫描变换是基于一条曲线或表面或形体沿某一路径运动而产生形体,现有CAD使用广泛。平行扫和旋转扫变换是最基本的方法。如果在平扫过程中引入缩放参数,还可以得到截面变化的锥形形体,如果扫描方向与z轴成一夹角,扫出的形体将是一个错切体。此外有自由扫、变截面扫、蒙皮技术等生成曲面和实体。平行扫变换通常由用户简单地定义一截面轮廓,然后沿指定方向平行延伸一定的距离生成平扫体旋转扫变换通常由用户简单地定义一截面轮廓,然后绕给定轴线旋转一定的角度生成旋转体。1.2扫描变换法广义扫变换值得说明的是:用户仅需按提示交互定义扫描截线及扫描轨迹,计算机内部用CSG表达记录定义参数及历史,同时自动生成定义形体的BREP表达模型。1.2扫描变换法1.3

局部操作局部操作从宏观上来看不改变形体的整体结构,只作局部修改。如圆角过渡、倒角等造型系统提供局部操作功能,目的是为用户提供更直观方便的定义形体局部信息的方法。值得说明的是:用户仅需按提示交互定义提供局部操作功能,计算机内部用CSG表达记录定义参数及历史,同时直接修改原始输入形体的BREP表达模型(即直接修改形体的面、环、边、点等数据表),并形成新的BREP表达。局部操作功能比在整体意义下形体间的布尔运算具有更高的效率和稳定性。1.3

局部操作1.4实体特征表示实体模型仅提供产品的几何形状信息,但不能显式地标注尺寸,末提供公差、表面粗糙度、材料性能和加工要求等重要的产品制造信息。第12讲建模系统关键技术

1.几何形体定义方法2.布尔运算基本原理3.三维形体的显示原理2.1布尔运算的提出问题:CAD系统是是如何将CSG过程中基本形体拼合成复杂形体的Brep表达?常见物体(无论多复杂)均可用用三维空间点集来表示;复杂形体可通过简单形体布尔运算生成,布尔运算也称为集合运算;CAD中常用布尔运算(并、交、差)操作符有:A∪B并运算,其结果是求A、B两个体素之和;A-B差运算,其结果是从A体减去B体后余下的部分;A∩B交运算,其结果是A、B两个体素的公共部分。2.2布尔运算定义及分类布尔运算按对象表达维数分一维、二维和三维布尔运算2.2布尔运算定义及分类A∪B

A-BA∩BA体B体例1例2A+BA-BA∩B例3A∪B

A-BA∩B2.2布尔运算案例几何造型中的布尔运算以集合论、拓扑学为理论基础。早期造型系统规定形体是三维欧氏空间中的正则集合。正则点集非正则点集三维正则点集含义:无悬面、悬边及孤立点的有限空间三维实体。任何物体都可用三维欧氏空间中点的集合来表示。但反过来,三维欧氏空间中任意点的集合却不一定对应于一个物体,如一些孤立点、悬面、悬线等。

正则点集的定义就是为了避免孤立点、悬面、悬线。2.3正则实体定义传统的点集之间的并、交、差运算可能改变点集的正则性质。也就是说,两个正则点集的集合运算的结果可能产生一个非正则点集。如图A、B两物体求交运算后,原来两物体问互相重合的部分边界面被保留而形成悬挂面。有必要对传统的点的集合运算施加一定的限制,为此定义2.4正则布尔运算其中U*,n*,一*分别表示正则化的并、交、差运算,r表示正则化算子,U,n,一表示传统并交差的集合运算设G是n维欧氏空间中的一个有界区域点集,则:

G={bG,iG}其中:bG是G的n-1维边界点集(或称超越表面)

iG是G的内部点集cG是G的外部点集正则点集非正则点集2.4正则布尔运算G空间中任何点满足邻域IN/ON/OUT分类,如图:其中ON类点的小球邻域被bG分隔成两个且仅两个互不连通的子域,它们分别属于iG和cG。GGGInOnOutInOnOut换句话说,形体边界点集bG将空间点集分为形体内点集iG和形体外点集cG。2.4正则布尔运算几何造型中的正则布尔运算实质上是对集合中的成员进行分类的问题。经过正则集合运算后所产生的新物体的边界是原两拼合物体边界的一个子集,即:例如,考察A、B两物体的交所形成拼合体的边界如下图所示,由上式则有:ABCb(A-B)(bAUbB)bB的一部分bA的一部分2.4正则布尔运算1)由于A、B为正则点集,因此A、B均可表示为边界点与体内点的集合,即:2)A的边界bA相对于物体B可分别表示为:B物体内:bA∩iBB物体上:bA∩bBB物体外:bA∩cB

3)

B的边界bB相对于A物体的表示为:A物体内:bB∩iAA物体上:bB∩bAA物体外:bB∩cA设正则点集C表示A、B两物体的交,C=A∩B。对于实体的BREP表达来说,我们仅需得到点集C的边界bC即可,于是:基于上述分析.当物体采用边界表示时,它们之间的集合运算可分为以下步:2.4正则布尔运算1)预检查两物体是否相交2.5正则运算步骤利用包容盒加速判断轴对齐包容盒AABB有向包容盒OBB离散有向多面体K-DOPn3n1n2n4s1d1maxd1min球包容盒交运算的结果(A∩B)例:A与B交运算(A∩B)常用的四种包容盒:2)计算两物体所有表面之间交线曲面求交算法(如前介绍)交运算的结果(A∩B)例:A与B交运算(A∩B)2.5正则运算步骤3)对两物体表面进行判定分类交运算的结果(A∩B)例:A与B交运算(A∩B)顶部红色表面其余蓝色表面2.5正则运算步骤4)建立新的Brep数据结构形成新形体的BREP表达,并能进行下一轮布尔运算交运算的结果(A∩B)例:A与B交运算(A∩B)2.5正则运算步骤2.6CAD系统建模过程中布尔运算形体定义输入1形体定义输入2形体定义输入n内部CSG+BREP表达布尔运算结果形体BREP表达三角剖分显示数据结构显示渲染显示参数定义Parasolid是EDS公司推出的CAD/CAM开发平台,是由英国剑桥的ShapeData公司研制的。目前,Parasolid全球已有7000多个基于它的最终用户产品,其应用范围主要集中在机械CAD/CAM/CAE领域,它的用户群包括系统开发商、企业、大学、研究机构等,尤其是以Parasolid为内核的UG、Solidworks等软件得到广泛应用。Parasolid动态库中的复杂曲面造型功能封装比较严,开放性较差(看起来UGS公司有所保留),但保证了稳定性。不过,有UG、Solidworks等软件支撑,市场更成功,可靠性及服务较ACIS要好。ACIS、Parasolid和OpenCasCade简介ACISOpenCasCadeParasolidACIS、Parasolid和OpenCasCade均为3D几何造型引擎ACIS是美国SpatialTechnology公司的三维几何造型引擎,它集线框、曲面和实体造型于一体,为各种3D造型应用开发提供几何造型平台。公司1986年成立,目前基于ACIS3DToolkit全球有400多个开发商,许多系统是以ACIS为造型内核,如AutoCAD,CADKEY等。ACIS是用C++语言编写,开放性好,容易上手,比较适用于研究工作。但少有基于ACIS的高中端CAD软件开发出来,ACIS的维护和提供实时的技术支持比Parasolid有差距,稳定性有待提高。OpenCasCade是由法国MDTV(MatraDatavision)公司开发的CAD/CAM软件平台。目前已应用于机械、船舶、地球科学和土木工程等领域,主要集中在专业性CAD/CAM/CAE、GIS等应用软件的开发。OpenCasCade是免费包,可下载源代码,适合学习研究,算法都看得到,不过需要良好的数学功底。典型CAD几何引擎ACIS介绍*ACIS开发商----SpatialSpatial公司成立于1986年,公司成立时主要经营CAM软/硬件产品2000年11月,达索公司收购了Spatial公司的ACIS部门ACIS主要特点面向对象的建模内核用C++语言开发组件体系结构混合建模技术,可以处理点/线/面/体支持多种主流平台

WindowsNT/2000/XP,UNIX,Linux,MAC典型CAD几何引擎ACIS介绍*Pro/ESTEPVDA/FSCATIAV4IGESUGParasolidSolidWorksInventorInterOpSATACISACISB-Rep3D模型HOOPS渲染建模功能点/线/面/体的创建和删除,布尔操作,混合,扫略Sweeping,蒙面Skinning,放样Lofting,局部操作LocalOperation,规则Law,覆盖Covering,交线,抽壳框架功能/实用程序网格(多面体近似),零件管理,历史管理,属性定义,单元拓扑CellularTopology,欧拉操作,特征注释典型CAD几何引擎ACIS介绍*ACIS几大模块之间内在关系典型CAD几何引擎ACIS介绍*ACIS系统数据结构ACIS是美国SpatialTechnology公司(现已被Dausslaute收购)推出的三维几何造型引擎,它集线框、曲面和实体造型于一体,并允许这三种表示共存于统一的数据结构中。几何(Geometry)、拓扑(Topology)和属性(Attribute)构成了ACIS模型,三者统一由最基础的抽象类ENTITY所派生.虽然ENTITY本身不代表任何对象,但在ENTITY中定义了它所有子类应具有的数据和方法(如存储、恢复、回溯等)。ACIS的拓扑包括BODY(体)、LUMP(块)、SHELL(壳)、SUBSHELL(子壳)、FACE(面)、LOOP(环)、WIRE(线框)、COEDGE(公共边)、EDGE(边)和VERTEX(顶点)。

ACIS把线框(WIREFRAME)、曲面(SURFACE)和实体(SOLID)存储在统一的数据结构中,这种共存机制使ACIS支持混合维模型和各种非闭合模型。典型CAD几何引擎ACIS介绍*ACIS拓扑与几何间的关系典型CAD几何引擎ACIS介绍*ACIS中模型的几何与拓扑对象C++类层次关系典型CAD几何引擎ACIS介绍*典型CAD几何引擎ACIS介绍*拓扑简介:BODY(体):一个模型单元,最高级别的拓扑类SolidBody,SheetBody,WireBodyFACE(面):一个面(如球面)或由多张面经过缝合构成一个Solidbody或SheetBodyEDGE(边):一条线或首尾相连的线将构成WireBodyACISC++应用程序基础知识初始化ACISapi_start_modeler()api_initialize_<componet>造型事件处理(如菜单)调用造型函数终止ACISapi_terminate_<componet>api_stop_modeler()应用程序ACIS典型目录构成ACISC++应用程序基础知识Debug版ACISdll库Release版ACISdll库ACISHeadfilesRelease版ACISLib库(编译连接)Debug版ACISLib库(编译连接)BridgebetweenACISandHOOPSHA_PARTACIS_ENTITYContainerACIS开发路径设置ACISC++应用程序基础知识1)VisualC++中配置头文件路径ACIS开发路径设置ACISC++应用程序基础知识2)VisualC++中配置连接库路径ACIS开发路径设置ACISC++应用程序基础知识3)VisualC++编译选项设置NT:Windows平台NT_DLLD:DebugNT_DLL:ReleaseSTRICT:strictertypecheckingintheWin32APIcallsACIS开发路径设置ACISC++应用程序基础知识4)CopySpaACIS.dllorSpaACISd.dllfilesfrom“AcisR12\bin\NT_VC9_DLL”tocurrentdirectorysuchas“debug\”5)或在系统目录设置“AcisR12\bin\NT_VC9_DLL”

ACIS中常见矢量运算函数

logicaldist_pt_to_line(…)SPApositionproj_pt_to_line(…)SPApositionproj_pt_to_plane(…)doubleangle_between(intintersect_line_plane(intintersect_plane_plane(logicalclosest_points(…)betweentwolinesintintersect_line_circle(voidcompute_axes_from_z()intfind_best_pt()findabestpointfromagroupofpointstoapointoraray.ACISC++应用程序基础知识ACIS中常见矢量运算函数

logicalcollinear(..)whetheragroupofpointsonalinewithanerrorcontroldoubledist_pt_to_plane(…)doubleside_of_plane(…)logicalintersect_3_planes(…)intintersect_2_circles(…)logicalint_2_lines_3d(…)logicalcircle_3_pos(…)ACISC++应用程序基础知识ACISC++应用程序基础知识ACIS_NEW和ACIS_DELETEACIS_NEW和ACIS_DELETE宏可以提高平台之间的兼容性ACIS内存管理机制提高了几何计算性能跟踪内存分配和释放(可以监测内存泄漏)当用ACIS_NEW创建的简单数据类型(如枚举,结构和矩阵等)在用ACIS_DELETE进行内存释放时需要使用STD_CAST来修饰

double*pData=ACIS_NEWdouble[5];

ACIS_DELETE[]STD_CASTpData;ACISAPI典型结构outcomeapi_NAME_function(){ API_BEGIN

… content…

… API_END returnresult;}ACISC++应用程序基础知识ACISAPI典型类outcomeACISC++应用程序基础知识ACISAPI返回“outcome”类型的对象“outcome”类包含了下列信息API调用的结果,成功/失败历史信息-用于UNDO/REDO操作在API_BEGIN宏中,定义了”outcome”类型的变量result在API_END宏中,检查result通常用到的成员函数outcome::ok()outcome::error_number()outcome::bb()//公共板ACISAPI---获取系统出错信息ACISC++应用程序基础知识获取出错消息的函数:find_err_mess()outcomeresult;result=api_xxxxxx();if(!result.ok()){constchar*text=

find_err_mess(result.error_number());

printf(text);}ACIS精度(tolerance)SPAresabs--绝对最小值(10e-6)SPAresnor--规格化最小值(10e-10)SPAresfit--曲线曲面的逼近精度(10e-3)SPAresmch--被认为是零的最大值(10e-11)用户可以改变SPAresabs但不能改变其他模型空间(可能的模型尺寸)通过SPAresabs和SPAresnor定义模型空间(modelspace)=SPAresabs/SPAresnor=10e-6/10e-10=10e4ACISC++应用程序基础知识ACISC++应用程序基础知识具体的边面上具体的边具体的面具体的点坐标几何CURVEAPOINTACIS几何类SURFACEPCURVEACIS几何类ACISC++应用程序基础知识ACIS几何类ENTITYSURFACECURVEPCURVEAPOINTCONESPLINETORUSSPHEREPLANEELLIPSESTRAIGHTINTCURVEsurfacecurvepcurveconesplinetorussphereplaneellipsestraightintcurve几何方程ACIS几何管理ACISC++应用程序基础知识几种边之间关系EDGE—CURVE--curveCOEDGEEDGECOEDGEPCURVEpcurvepar_curbs2_curvesurfaceINTCURVEintcurveexact_int_curbs3_curPCURVEpcurvebs2_curvepar_cursurfaceACISC++应用程序基础知识FACESURFACEPLANEplanepositionnomal_vecsurface几种面之间关系FACE—SURFACE--surfaceACISC++应用程序基础知识ACIS拓扑类模型结构ACIS拓扑类BODYLUMPSHELLFACEWIRELOOPCOEDGEEDGEVERTEX是一个模型模型有一个块块上有一系列的壳一系列的面的每个壳都有一个面面都有边界面上有不可见的边面的结合处有作为边界的边边界边都有端点ACISC++应用程序基础知识ACIS拓扑类BODYLUMPSHELLFACEWIRELOOPCOEDGEEDGEVERTEXENTITY#include“ckoutcom.hxx”#include“swp_opts.hxx”#include“sweepapi.hxx”outcomeapi_make_triangle(BODY*&body){ SPApositionp1(-10,-5,0); SPApositionp2(10,-5,0); SPApositionp3(0,10,0); EDGE*e1=NULL; EDGE*e2=NULL; EDGE*e3=NULL;ACISC++应用程序开发案例ACIS-API函数编程案例—利用现有API函数构造形体p1p2p3 BODY*wirebody=NULL; API_BEGIN result=api_curve_line(p1,p2,e1); result=api_curve_line(p2,p3,e2); result=api_curve_line(p3,p1,e3);EDGE*edges[3];edges[0]=e1;edges[1]=e2;edges[2]=e3;result=api_make_ewire(3,edges,wirebody);check_outcome(result);ACIS-API函数编程案例—利用现有API函数构造形体sweep_options*options=ACIS_NEWsweep_options();BODY*dmy=NULL;result= api_sweep_with_options(wirebody,SPAvector(0,0,10),options,dmy);check_outcome(result);

ACIS_DELETEoptions;API_ENDif(result.ok())body=wirebody;returnresult;}ACIS-API函数编程案例—用户填写Brepoutcomeapi_make_triangle(BODY*&body){API_BEGIN

SPApositionp1(-10,-5,0); SPApositionp2(10,-5,0); SPApositionp3(0,10,0);SPApositionp4(-10,-5,10); SPApositionp5(10,-5,10); SPApositionp6(0,10,10);APOINT*AP1=ACIS_NEWAPOINT(p1);

APOINT*AP2=ACIS_NEWAPOINT(p2);

APOINT*AP3=ACIS_NEWAPOINT(p3);

APOINT*AP4=ACIS_NEWAPOINT(p4);

APOINT*AP5=ACIS_NEWAPOINT(p5);

APOINT*AP6=ACIS_NEWAPOINT(p6);

p1p2p3p6p4p5ACIS-API函数编程案例—用户填写BrepVERTEX*V1=ACIS_NEWVERTEX(AP1);VERTEX*V2=ACIS_NEWVERTEX(AP2);VERTEX*V3=ACIS_NEWVERTEX(AP3);VERTEX*V4=ACIS_NEWVERTEX(AP4);VERTEX*V5=ACIS_NEWVERTEX(AP5);VERTEX*V6=ACIS_NEWVERTEX(AP6);p1p2p3p6p4p5STRAIGHT*S1=ACIS_NEWSTRAIGHT(p1,normalise(p2-p1));STRAIGHT*S2=ACIS_NEWSTRAIGHT(p2,normalise(p3-p2));STRAIGHT*S3=ACIS_NEWSTRAIGHT(p3,normalise(p1-p3));STRAIGHT*S4=ACIS_NEWSTRAIGHT(p4,normalise(p5-p4));STRAIGHT*S5=ACIS_NEWSTRAIGHT(p5,normalise(p6-p5));STRAIGHT*S6=ACIS_NEWSTRAIGHT(p6,normalise(p4-p6));STRAIGHT*S7=ACIS_NEWSTRAIGHT(p1,normalise(p4-p1));STRAIGHT*S8=ACIS_NEWSTRAIGHT(p2,normalise(p5-p2));STRAIGHT*S9=ACIS_NEWSTRAIGHT(p3,normalise(p6-p3));

e1e2e3e4e5e6e7e8e9ACIS-API函数编程案例—用户填写BrepEDGE*e1=ACIS_NEWEDGE(V1,V2,S1,FORWARD);EDGE*e2=ACIS_NEWEDGE(V2,V3,S2,FORWARD);EDGE*e3=ACIS_NEWEDGE(V3,V1,S3,FORWARD);EDGE*e4=ACIS_NEWEDGE(V4,V5,S4,FORWARD);EDGE*e5=ACIS_NEWEDGE(V5,V6,S5,FORWARD);EDGE*e6=ACIS_NEWEDGE(V6,V4,S6,FORWARD);EDGE*e7=ACIS_NEWEDGE(V1,V4,S7,FORWARD);EDGE*e8=ACIS_NEWEDGE(V2,V5,S8,FORWARD);EDGE*e9=ACIS_NEWEDGE(V3,V6,S9,FORWARD);p1p2p3p6p4p5e1e2e3e4e5e6e7e8e9LOOPCOEDGECOEDGECOEDGECOEDGEACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e9%面1:e1,e2,e3COEDGE*ce11=ACIS_NEWCOEDGE(e1,REVERSED,NULL,NULL);COEDGE*ce21=ACIS_NEWCOEDGE(e2,REVERSED,ce11,NULL);ce11->set_next(ce21);COEDGE*ce31=ACIS_NEWCOEDGE(e3,REVERSED,ce21,ce11);ce21->set_next(ce31);ce11->set_previous(ce31);ACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e9%面2:e4,e5,e6COEDGE*ce42=ACIS_NEWCOEDGE(e4,FORWARD,NULL,NULL);COEDGE*ce52=ACIS_NEWCOEDGE(e5,FORWARD,ce42,NULL);ce42->set_next(ce52);COEDGE*ce62=ACIS_NEWCOEDGE(e6,

FORWARD,ce52,ce42);ce52->set_next(ce62);ce42->set_previous(ce62);ACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e9%面3:e1,e8,e4,e7COEDGE*ce13=ACIS_NEWCOEDGE(e1,FORWARD,NULL,NULL);COEDGE*ce83

=ACIS_NEWCOEDGE(e8,FORWARD,ce13,NULL);ce13->set_next(ce83);COEDGE*ce43=ACIS_NEWCOEDGE(e4,REVERSED,ce83,NULL);ce83->set_next(ce43);COEDGE*ce73=ACIS_NEWCOEDGE(e7,REVERSED,ce43,ce13);ce43->set_next(ce73);ce13->set_previous(ce73);ACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e9%面4:e2,e9,e5,e8COEDGE*ce24=ACIS_NEWCOEDGE(e2,FORWARD,NULL,NULL);COEDGE*ce94

=ACIS_NEWCOEDGE(e9,FORWARD,ce24,NULL);ce24->set_next(ce94);COEDGE*ce54=ACIS_NEWCOEDGE(e5,REVERSED,ce94,NULL);ce94->set_next(ce54);COEDGE*ce84=ACIS_NEWCOEDGE(e8,REVERSED,ce54,ce24);ce54->set_next(ce84);ce24->set_previous(ce84);ACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e9%面5:e3,e7,e6,e9COEDGE*ce35=ACIS_NEWCOEDGE(e3,FORWARD,NULL,NULL);COEDGE*ce75

=ACIS_NEWCOEDGE(e7,FORWARD,ce35,NULL);ce35->set_next(ce75);COEDGE*ce65=ACIS_NEWCOEDGE(e6,REVERSED,ce75,NULL);ce75->set_next(ce65);COEDGE*ce95=ACIS_NEWCOEDGE(e9,REVERSED,ce65,ce35);ce65->set_next(ce95);ce35->set_previous(ce95);ACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e912345%LOOPLOOP*L1=ACIS_NEWLOOP(ce11,NULL);LOOP*L2=ACIS_NEWLOOP(ce42,NULL);LOOP*L3=ACIS_NEWLOOP(ce13,NULL);LOOP*L4=ACIS_NEWLOOP(ce24,NULL);LOOP*L5=ACIS_NEWLOOP(ce35,NULL);ACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e912345%PLANEgeometryforfacereconstructionPLANE*PL1=ACIS_NEWPLANE(p1,normalise((p3-p1)*(p2-p1)));PLANE*PL2=ACIS_NEWPLANE(p4,normalise((p5-p4)*(p6-p4)));PLANE*PL3=ACIS_NEWPLANE(p1,normalise((p2-p1)*(p4-p1)));PLANE*PL4=ACIS_NEWPLANE(p2,normalise((p3-p2)*(p5-p2)));PLANE*PL5=ACIS_NEWPLANE(p1,normalise((p4-p1)*(p3-p1)));ACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e912345%FACEFACE*face1=ACIS_NEWFACE(L1,NULL,PL1,FORWARD);FACE*face2=ACIS_NEWFACE(L2,face1,PL2,FORWARD);FACE*face3=ACIS_NEWFACE(L3,face2,PL3,FORWARD);FACE*face4=ACIS_NEWFACE(L4,face3,PL4,FORWARD);FACE*face5=ACIS_NEWFACE(L5,face4,PL5,FORWARD);SHELL*pShell

=ACIS_NEWSHELL(face1,NULL,NULL);LUMP*pLump=ACIS_NEWLUMP(pShell,NULL);BODY*pBody=ACIS_NEWBODY(pLump);ACIS-API函数编程案例—用户填写Brepp1p2p3p6p4p5e1e2e3e4e5e6e7e8e912345%FACEFACE*face1=ACIS_NEWFACE(L1,NULL,PL1,FORWARD);FACE*face2=ACIS_NEWFACE(L2,face1,PL2,FORWARD);FACE*face3=ACIS_NEWFACE(L3,face2,PL3,FORWARD);FACE*face4=ACIS_NEWFACE(L4,face3,PL4,FORWARD);FACE*face5=ACIS_NEWFACE(L5,face4,PL5,FORWARD);SHELL*pShell

=ACIS_NEWSHELL(face1,NULL,NULL);LUMP*pLump=ACIS_NEWLUMP(pShell,NULL);BODY*pBody=ACIS_NEWBODY(pLump);API_ENDreturnresult;}#ifdefEXPORT_BBI2A

#defineDECL_BBI2A__declspec(dllexport)//输出动态库#else

#defineDECL_BBI2A__declspec(dllimport)//输入动态库

#ifdefNT #pragmamessage("自动链接动态库bbi2a.dll") #pragmacomment(lib,"bbi2a.lib")//在VC++中强制链接

#endif#endifACIS-用户自定义实体编程(类定义部分—头文件)//指定派生层次的标识externDECL_BBI2AintENT_HCC_TYPE;#defineENT_HCC_LEVEL(ENTITY_LEVEL+1)//类定义classDECL_BBI2AENT_HCC:publicENTITY{protected: int m_nVersion; //对象版本号

ENTITY*m_pOwner;//父对象

char *m_szEntName;//对象名称ACIS-用户自定义实体编程(类定义部分—头文件)public:

//标准成员函数,从ACIS派生

ENTITY_FUNCTIONS(ENT_HCC,BBI2A)

LOOKUP_FUNCTION//搜索对象的私有链表,ENT_HCC(); //缺省构造函数

//查询函数(….略)

//修改函数

voidSetVersion(intversion);voidSetOwner(ENT_HCC*owner)voidSetEntName(constchar*szName);};ACIS-用户自定义实体编程(类定义部分—头文件)ACIS-用户自定义实体编程(类实现部分—CPP文件)#include"stdafx.h"//供外部使用的标识,来区分一个特定的实体类型。该标识仅仅用于转换外部文件//格式的保存/恢复机制中,但必须保证在所有的开发者中唯一。#defineENT_HCC_NAME"ent_hcc"#defineTHIS()ENT_HCC#defineTHIS_LIBBBI2A#definePARENT()ENTITY#definePARENT_LIBKERNACIS-用户自定义实体编程(类实现部分—CPP文件)ENTITY_DEF(ENT_HCC_NAME) debug_int("Version",m_nVersion,fp); debug_new_pointer("Owner",m_pOwner,fp);LOOKUP_DEF

SAVE_DEF write_int(VERSION112); write_ptr(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论