CN101944080A - 一种基于dxf文件格式的读取与xml转换的方法 - Google Patents
一种基于dxf文件格式的读取与xml转换的方法 Download PDFInfo
- Publication number
- CN101944080A CN101944080A CN 201010271291 CN201010271291A CN101944080A CN 101944080 A CN101944080 A CN 101944080A CN 201010271291 CN201010271291 CN 201010271291 CN 201010271291 A CN201010271291 A CN 201010271291A CN 101944080 A CN101944080 A CN 101944080A
- Authority
- CN
- China
- Prior art keywords
- state
- dxf
- file
- name
- root
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种基于DXF文件格式的读取与XML转换的方法,涉及使用CAD工程制图的各类工程技术领域,本方法把DXF文件结构当作一种形式语言来处理,使用3型文法描述DXF文件结构,使用有限状态自动机对DXF文件内容进行识别,即顺序读入DXF文件的字符,一对组码和组值为一组,按组循环,根据读入的组码和组值,进行事件推进,状态转移以及事件处理,输出XML格式的文件,直到文件读入字符为EOF。这就进行了DXF格式到XML格式的转换。本发明能够有效的处理非标准的DXF文件,具有通用性、灵活性、可扩充性和可移植性。转换后的XML文件格式良好,结构清晰,使得用户专用软件,各类工程软件进行有效数据的提取变得十分简易,不必花费大量时间研究DXF组码和组值结构,降低了开发成本。
Description
技术领域
本发明涉及使用CAD工程制图的各类工程技术领域,DXF(drawing exchange format)图形交换文件格式在不同的CAD软件间进行图形数据交换,实现资源共享。本技术实现DXF图形交换文件转换成XML文件,有利于使用XML数据挖掘技术提取其有效数据,形成数据仓库,用于各类工程专用软件。
背景技术
本发明基于城市交通标志标线智能评价系统,实现从设计人员交付的交通道路CAD图提取有效数据而发明的。
不同CAD软件的文件格式不尽相同,出于商业考虑,一般其标准格式文件都没有公开。由于产品扩展的需要,CAD软件一般都提供二次开发工具来读取其数据,如AutoCAD的DWG文件,可以使用AutoDesk公司提供的ObjectARX、AutoLisp或VBA,通过编程来读取信息。把读取的数据转储至预定义好结构的关系型数据库中。这样,工程图形文件的数据挖掘就转化为关系型数据的挖掘。这种处理方式有其局限性,需依赖于CAD软件,不支持所有字节的读取;并且由于各种CAD软件各不相同,需按不同的方式来处理,给数据挖掘带来了不便。
AutoCAD采用了DXF(drawing exchange format)图形交换文件格式在不同的CAD软件间进行图形数据交换。随着AutoCAD软件的日益流行,DXF文件事实上已成为国际通用的图形数据交换标准。
DXF文件本质是一种ASCII文本文件,但它与普遍的文本文件又不尽相同,它是一种有限结构的文件,具有层次性,对各种参数的描述是用代码(组码)和与代码相关联的值(组值)构成,组码和组值联合起来表示一个数据的含义和数据的值。很多软件直接把DXF作为挖掘对象,通过文本挖掘工具对DXF进行数据挖掘,提取其中的有效数据,供工程图的应用系统使用。这种方式不足之处是:①虽然文本挖掘技术已经比较成熟,但挖掘数据的难度还是较大;②在提取数据时,需多次对DXF格式的文本文件进行操作,对文本文件操作效率较低。
发明内容
本发明所要解决的技术问题是提供一种可以从任何CAD图形文件转换成XML文件,方便提取出有效数据,实现资源共享的通用方法。
本发明不受CAD图形文件各个版本的限制,对所有的CAD图都能够转换成格式良好的XML文件。
转换后的XML文件,格式良好,数据结构清晰,使得数据挖掘提取变得十分简易。
本发明可以广泛用于各类工程软件当中。
本发明的技术方案是:
1.技术方案目标:如图1所示,左图是原DXF文件数据格式截图,右图为转换后的XML文件数据格式截图。从图中可以看出,转换后的XML文件数据格式已经较为容易阅读,而实际上,从计算机软件来看,对XML文件进行数据挖掘要比文本格式的DXF文件容易得多。
2.技术方案原理:要实现DXF文件转换成XML文件这样的功能,类似于计算机程序运行的编译阶段,如图2所示。
日常通用的自然语言是人们交流思想的主要工具,自然语言复杂,往往难以进行描述。而人与计算机打交道的程序设计语言则具有语法严格、结构正规、便于计算机处理的特点,而DXF文件数据格式也具有程序设计语言一样的特性。由于程序设计语言和自然语言存在共性,语言的核心是由语法和语义两部分组成。语法是语言的形式,语义是语言的内容,以语法为媒介来说明语义是语言的实质。语言是由具有独立意义的单词根据一定的语法规则构成的表达一定意义的句子组成的集合。给定字母表∑,一个语言可看做是∑*中的某个子集。要分析语言就要知道其结构,文法就是一种能够用有限规则来展现出语言的结构的形式。语言学家乔姆斯基(Avram Noam Chomsky)对某些自然语言进行研究的基础上,提出了一种用于描述语言的数学系统,并以此定义了4类不同的文法和语言。乔姆斯基分类,即将文法按状态转换函数的不同具体分成4类,4类文法对应4种类型的语言,且有相应的自动机来识别。从0型到3型,其后一类都是前一类的子集,且限制是逐步增强的,而描述语言的功能是逐步减弱的。确定的有限状态自动机(Deterministic Finite Automation,DFA)是一个具有离散输入、输出系统的数学模型,它是4类文法的识别装置中最基本、最重要的一种。而DXF文件的数据完全可以使用3型文法来表达,因此可以把DXF文件数据当成一种语言来识别,而使用的识别装置就是确定的有限状态自动机。
3.技术方案设计与实现:
第一步:根据DXF文件的格式,设计出能够识别该DXF数据格式的3型文法,这里用状态转换图来表示,设计的状态转换图见图6至图12。
状态:在DXF文件格式中,每一个有子节点的图元组码,设计成一个状态。
输入字符:DXF文件数据的输入流,将一对组码组值设计成为一个输入字符。
状态转换函数:根据当前状态和输入字符确定下一个状态。
初态:初始状态ROOT。
终态:结束状态ROOT。
一个确定的有限状态自动机M(DFA M)是一个五元组
M=(Q,∑,f,q0,Z)
其中,Q为状态的有限集合,每个元素称为一个状态;∑为输入字符的有限集合,每个元素是一个输入字符;f为状态转换函数,是一个从QX∑到Q的映射。q0为M的唯一初态,q0∈Q;Z为M的终态集,Z是Q的子集。
对于DXF文件结构使用状态转换图和五元表达式进行描述,其中状态按照DXF文件结构本身的逻辑含义进行设计,不违背原本的语义。设计原则是,具有包含关系或者循环并列关系的设计为一个状态,每个状态中DXF文件中都能够找到原型,每个状态的名字与DXF文件结构说明文档中结构名字一致。状态具体说明如下:
ROOT为新增的一个状态,作为根状态;
SECTION为DXF文件结构中的一个段;
HEADER,CLASSES,ENTITIES,BLOCKS,OBJECTS,TABLES为DXF文件结构中具体的段结构;
段内结构的状态详见每个段的解析。
ENTITIES段:该有限状态自动机所对应的状态图如图3所示。
五元表达式为:
M=({ROOT,SECTION,ENTITIES,ENTITY,ENTITYPROPERTY},{(0,SECTION),(2,ENTITY),(0,*),(100,ACDB*),(0,ENDSEC)},f,ROOT,{ROOT})
上面五元表达式中每个变元的具体含义如下:
(1){ROOT,SECTION,ENTITIES,ENTITY,ENTITYPROPERTY}代表了五个不同的状态,每一状态都作为程序中状态类的一个具体实例;其中ENTITY为具体的图元类型,如LINE,LWPOLYLINE等,ENTITYPROPERTY为子类。
(2){(0,SECTION),(2,ENTITY),(0,*),(100,ACDB*),(0,ENDSEC)}代表了五个不同的状态转移事件;
(3)f代表了状态转换函数,状态集合用Q表示,输入字符集合用∑表示,状态转换函数是QX∑到Q的映射;
其中f为:
f(ROOT,(0,SECTION))=SECTION
f(SECTION,(2,ENTITIES))=ENTITIES
f(ENTITIES,(0,*))=ENTITY
f(ENTITIES,(0,ENDSEC))=ROOT
f(ENTITY,(100,ACDB*))=ENTITYPROPERTY
f(ENTITYPROPERTY,(0,*))=ENTITY
f(ENTITYPROPERTY,(0.SECTION))=ROOT
(4)ROOT代表了整个有限状态自动机的起始状态;
(5){ROOT}代表了整个有限状态自动机的终态集合;
HEADER段:该确定的有限状态机如图7所示;
该五元表达式为:
M=({ROOT,SECTION,HEADER,VARIABLE},{(0,SECTION),(9,*),(0,EDNSEC)},f,ROOT,{ROOT})
其中VARIABLE为HEADER段的具体变量实例;
其中f为:
f(ROOT,(0,SECTION))=SECTION
f(SECTION,(2,HEADER))=HEADER
f(HEADER,(9,*))=VARIABLE
f(VARIABLE,(9,*))=VARIABLE
f(VARIABLE,(0,ENDSEC))=ROOT
CLASSES段:该确定的有限状态机如图8所示;
该五元表达式为:
M=({ROOT,SECTION,CLASSES,CLASS},{(0,SECTION),(2,CLASSES),(0,CLASS),(0,ENDSEC)},f,ROOT,{ROOT})
其中CLASS代表具体的类实例;
其中f为:
f(ROOT,(0,SECTION))=SECTION
f(SECTION,(2,CLASSES))=CLASSES
f(CLASSES,(0,CLASS))=CLASS
f(CLASS,(0,CLASS))=CLASS
f(CLASS,(0,ENDSEC))=ROOT
TABLE段:该确定的有限状态机如图9所示;
该五元表达式为:
M=({ROOT,SECTION,TABLES,TABLE,TABLE_PROPERTY,RECORD,RECORD_PRO},{(0,SECTION),(2,TABLES),(0,TABLE),(2,*),(0,*),(100,ACDB*),(0,ENDTABLE),(0,ENDSEC)},f,ROOT,{ROOT})
其中TABLE为表段中的一个表,TABLE_PROPERTY为具体类型的表,RECORD具体类型表的实例,RECORD_PRO为子类标记;
其中f为:
f(ROOT,(0,SECTION))=SECTION
f(SECTION,(2,TABLES))=TABLES
f(TABLES,(0,TABLE))=TABLE
f(TABLES,(0,ENDSEC))=ROOT
f(TABLE,(2,*))=TABLE_PROPERTY
f(TABLE_PROPERTY,(0,*))=RECORD
f(TABLE_PROPERTY,(0,ENDTABLE))=TABLES
f(RECORD,(100,ACDB*))=RECORD_PRO
f(RECORD_PRO,(0,*))=RECORD
f(RECORD,(0,ENDTABLE))=TABLES
BLOCKS段:该确定的有限状态机如图10所示;
该五元表达式为:
M=({ROOT,SECTION,BLOCKS,BLOCK,AcDbBlockBegin,BlockEntity,BlockEntityProperty,EndBlock},{(0,SECTION),(2,BLOCKS),(0,BLOCK),(100,AcDbBlockBegin),(0,*),(0,ENDBLK),(100,ACDB*),(100,AcDbBlockEnd),(0,ENDSEC)},f,ROOT,{ROOT})
其中BLOCK状态表示图元类型为block,AcDbBlockBegin为BLOCK中的子类标记,,BlockEntity为BLOCK中的子类标记,BlockEntityProperty为BLOCK中的图元类型,EndBlock表示图元类型为ENDBLOCK;
其中f为:
f(ROOT,(0,SECTION))=SECTION
f(SECTION,(2,BLOCKS))=BLOCKS
f(BLOCKS,(0,BLOCK))=BLOCK
f(BLOCKS,(0,ENDSEC))=ROOT
f(BLOCK,(100,AcDbBlockBegin))=AcDbBlockBegin
f(AcDbBlockBegin,(0,*))=BlockEntity
f(AcDbBlockBegin,(0,ENDBLK))=EndBlock
f(BlockEntity,(100,ACDB*))=BlockEntityProperty
f(BlockEntityProperty,(0,*))=BlockEntity
f(BlockEntityProperty,(0,EndBlk))=EndBlk
f(EndBlock,(100,AcDbBlockEnd))=BLOCKS
OBJECTS段:该确定的有限状态自动机所对应的状态图如12所示;
该五元表达式为:
M=({ROOT,SECTION,OBJECTS,OBJECT},{(0,SECTION),(2,OBJECTS),(0,*),(0,ENDSEC)},f,ROOT,{ROOT})
其中OBJECT为具体的对象实例;
其中f为:
f(ROOT,(0,SECTION))=SECTION
f(SECTION,(2,OBJECTS))=OBJECTS
f(OBJECTS,(0,*))=OBJECT
f(OBJECTS,(0,ENDSEC))=ROOT
f(OBJECT,(0,*))=OBJECT
f(OBJECT,(0,ENDSEC))=ROOT
第二步:用程序实现有限状态自动机对DXF文件进行解析转换。
图4是实现确定的有限状态自动机的程序设计图。程序中有四个类型数据结构:状态,事件,转移,事件处理。状态代表是有限状态自动机中的状态,事件代表输入字符,转移代表状态转换函数,事件处理就是遇到每一个输入字符进行相应的处理,用以输出我们想要的目标数据格式。
程序中的需要实现的数据结构:
状态(对应了有限状态自动机中的不同状态):name标识,状态转换函数集(根据事件可以确定下一个状态,可以称之为边,即从本状态射出的所有边集)
成员:
Name:状态的名字,唯一标识
nextStateTable:边集,key为事件,value为状态转换函数。
例:如图3状态转换图,一个圆作为一个状态,圆内文字作为名字标识,状态转换函数集即从该状态射出的射线的集合,可以用Map数据结构进行存储。
事件(对应了有限状态自动机中的事件):使用组码和组值作为标识。
成员:
Codename:组码
Codevalue:组值
状态转换函数(对应有限状态自动机中的状态转换函数):即边,记录着事件和下一状态,以及事件处理时的一些类型值。
成员:
StateName:记录下一状态
Type:类型type为1时,进栈,输出开始标签;type为2时,出栈,输出闭合标签;type为3时,先输出闭合标签,在输出开始标签,栈不动;type为4时,无动作。
事件处理:用作事件处理,决定着输出的格式。根据状态转换函数中的一些类型值type来决定执行以下哪个行为。
1.I型,type=1,从父节点状态向子节点状态转移时,在程序中表现为状态转换函数中的type,从父节点向子节点状态转移时,见图3。子节点状态进栈,同时输出该子节点在xml文件中的开始标签,标签名为状态名字。从前列状态向后续状态移动,表现在状态转移图上就是从左到右的状态转移,状态转移的同时读取组码、组值、状态名,并将这三者分别压入对应的堆栈中,同时输出该状态对应在xml文件中的开始标签,标签名为状态名字(注:VARIABLE状态比较特别,他不会作为标签名,而是以对应该状态的组码值作为标签名)。
2.II型,type=2,从子节点状态向祖先节点状态转移时,出栈,并输出当前出栈状态在XML文件中的闭合标签。循环出栈,直到该祖先状态出栈为止。从后续状态向前列状态移动,表现在状态转移图上就是从右到左的状态转移,状态转移的同时将组码、组值、状态名对应的堆栈中的信息弹出,同时输出该状态对应在xml文件中的闭合标签。
3.III型,type=3,在一个状态转移到自身时,先输出前一状态的内容,再输出前一状态在XML文件中的闭合标签,再输出当前状态在XML文件中的开始标签,栈不动。在同一状态自身循环移动,表现在状态转移图上就是某一状态自身的循环转移,状态转移的同时将前一状态对应的组码、组值、状态名对应的堆栈中的信息弹出,同时输出该子节点在xml文件中的闭合标签,再读取下一状态的组码、组值、状态名,并将这三者分别压入对应的堆栈中,同时输出该状态对应在在xml文件中的开始标签,标签名为状态名字(注:VARIABLE状态比较特别,他不会作为标签名,而是以对应该状态的组码值作为标签名)。
转移对象:使用相应的数据结构存储状态集、事件集,使用栈记录向子节点移动的深度,以及每一层的状态,顺序读入DXF文件的字符,一对组码和组值为一组,按组循环,根据读入的组码和组值,进行事件推进,状态转移以及事件处理,直到文件读入字符为EOF。
程序主流程:
步骤一:初始化状态集,事件集,边集(状态转换函数集),当前状态为开始状态ROOT。
步骤二:从DXF读入字符,读入一对组值组码,触发事件的产生。
步骤三:根据当前状态,以及事件类型,在当前状态的状态转换函数集中可以找到下一状态,进行状态转移,把当前状态设为下一状态,并且调用事件处理类进行事件处理。
步骤四:循环第2,3步,直到文件读入字符为EOF时,跳出循环。
步骤五:程序结束。
第三步:DXF文件作为系统的输入,XML文件作为系统的输出。
4.设计方案的成果:
转换后的XML格式具有良好的语义,与CAD图元本身结构相符合,使开发人员不用花费大量时间去研究DXF的语义。如图5所示
本发明的使用十分简单,可以作为一个单独的运行程序,便可以完成用户指定的DXF文件到XML文件的转换,也可以作为用户系统中工程的一部分,进行调用。
针对本发明,本人研究DXF文件画出了所有段的状态转换图(图6至图12),软件可以根据状态转换图使用自动机进行解析DXF文件,并且实现了一个DXF转换XML软件,对多种DXF文件进行实验,经过大量的测试和应用表明,本发明研究的基于DFA的DXF文件信息转换方法能完整处理DXF文件的所有信息。不会局限于DXF的版本以及细节不同的格式,所以能够有效的处理标准和非标准的DXF文件,具有通用性、灵活性、可扩充性和可移植性。转换后的XML文件格式良好,结构清晰,使得用户专用软件,各类工程软件进行有效数据的提取变得十分简易,不必花费大量时间研究DXF组码和组值结构,大大降低了开发成本。
附图说明
图1原DXF文件和转换后XML文件对比图
图2源程序的编译
图3DXF中的ENTITIES段状态转换图
图4技术方案程序设计图
图5DXF文件数据结构图
图6DXF文件结构总状态转换图,作为本方法所用到的有限状态自动机的总示意图,其中标示出了整个有限状态自动机的所有状态,从这个图中我们可以开出所有的段的识别有限状态自动机都是从一个根状态开始出发,然后后面的一竖排圆都是代表了一个子状态集合,分别对应了识别该段的自动机。
图7HEADER段状态转换图
图8CLASSES段状态转换图
图9TABLES段状态转换图,这里有一个“*原则”就是如上图中对应的第四个状态转移事件(2*)应该和第五个状态转移事件(0*)以及第六个状态转移事件(100acdb*)相对应,具体对应规则可以参见DXF文档规范。
图10BLOCKS段状态转换图
图11ENTITIES段状态转换图
图12OBJECTS段状态转换图
图6至图12中圆表示状态,状态都有唯一标识——名字;射线上的文字为事件,一对组码和组值;射线为状态转换函数,存储下一状态和事件处理类型(I型,II型,III型即type=l,2,3)
具体实施方式
步骤一:创建有限状态自动机的基本功能类。
State:状态类
FSMEvent:事件类
Production:状态转换函数
Handle:事件处理
Transition:转移对象
详细如下:
状态(对应了有限状态自动机中的不同状态):name标识,状态转换函数集(根据事件可以确定下一个状态,可以称之为边,即从本状态射出的所有边集)
成员:
Name:状态的名字,唯一标识
nextStateTable:边集,key为事件,value为状态转换函数。
例:如图3状态转换图,一个圆作为一个状态,圆内文字作为名字标识,状态转换函数集即从该状态射出的射线的集合,可以用Map数据结构进行存储。
事件(对应了有限状态自动机中的事件):使用组码和组值作为标识。
成员:
Codename:组码
Codevalue:组值
状态转换函数(对应有限状态自动机中的状态转换函数):即边,记录着事件和下一状态,以及事件处理时的一些类型值。
成员:
StateName:记录下一状态
Type:类型type为1时,进栈,输出开始标签;type为2时,出栈,输出闭合标签;type为3时,先输出闭合标签,在输出开始标签,栈不动;type为4时,无动作。
事件处理:用作事件处理,决定着输出的格式。根据状态转换函数中的一些类型值type来决定执行以下哪个行为。
1.I型,type=1,从父节点状态向子节点状态转移时,在程序中表现为状态转换函数中的type,从父节点向子节点状态转移时,见图3。子节点状态进栈,同时输出该子节点在xml文件中的开始标签,标签名为状态名字。从前列状态向后续状态移动,表现在状态转移图上就是从左到右的状态转移,状态转移的同时读取组码、组值、状态名,并将这三者分别压入对应的堆栈中,同时输出该状态对应在xml文件中的开始标签,标签名为状态名字(注:VARIABLE状态比较特别,他不会作为标签名,而是以对应该状态的组码值作为标签名)。
2.II型,type=2,从子节点状态向祖先节点状态转移时,出栈,并输出当前出栈状态在XML文件中的闭合标签。循环出栈,直到该祖先状态出栈为止。从后续状态向前列状态移动,表现在状态转移图上就是从右到左的状态转移,状态转移的同时将组码、组值、状态名对应的堆栈中的信息弹出,同时输出该状态对应在xml文件中的闭合标签。
3.III型,type=3,在一个状态转移到自身时,先输出前一状态的内容,再输出前一状态在XML文件中的闭合标签,再输出当前状态在XML文件中的开始标签,栈不动。在同一状态自身循环移动,表现在状态转移图上就是某一状态自身的循环转移,状态转移的同时将前一状态对应的组码、组值、状态名对应的堆栈中的信息弹出,同时输出该子节点在xml文件中的闭合标签,再读取下一状态的组码、组值、状态名,并将这三者分别压入对应的堆栈中,同时输出该状态对应在在xml文件中的开始标签,标签名为状态名字(注:VARIABLE状态比较特别,他不会作为标签名,而是以对应该状态的组码值作为标签名)。
转移对象:使用相应的数据结构存储状态集、事件集,使用栈记录向子节点移动的深度,以及每一层的状态,顺序读入DXF文件的字符,一对组码和组值为一组,按组循环,根据读入的组码和组值,进行事件推进,状态转移以及事件处理,直到文件读入字符为EOF。
步骤二:根据所有状态图转换初始化数据集
例:根据实体段状态转换图初始化数据集,其它段类似:
该段五元表达式为:
M=({ROOT,SECTION,ENTITIES,ENTITY,ENTITYPROPERTY},{(0,SECTION),(2,ENTITY),(0,*),(100,ACDB*),(0,ENDSEC)},f,ROOT,{ROOT})
表达式1实体段五元表达式
初始化状态:
每一个状态初始化为一个状态对象,这个对象的name值为状态的名字。
如ROOT状态:State SRoot=new State(“ROOT”);SRoot就是这个状态的对象。
如SECTION状态:State SSection=new State(“SECTION”);SSection就是这个状态的对象。
本状态图共有ROOT,SECTION,ENTITIES,ENTITY,ENTITYPROPERTY五个状态对象。
初始化事件对象:
即表达式1中的输入字母表。
FSMEvent ESection=new FSMEvent(“0”,”SECTION”);
“*”代表任何字符串,在程序中可以使用特殊的字符串来表示,如“VARIABLE”。
初始化状态转换函数并且加到状态中的状态转换函数集中:
见图3的边,一个状态中的状态转换函数集中包含所有由该状态射出的射线,状态转换函数包含的内容有一状态的名字,以及type的值,用以传递参数给Handle类做出不同的处理。
如从ROOT射出的一条边,Production PRootSection=new Production(“SECTION”,1).
Production构造函数第一个参数为下一状态的name,第二个参数为type,在状态图表示为I II III型,分别表示type=1,type=2,type=3
将事件ESection和状态转换函数PRootSection加到状态ROOT中的状态转换函数集中。Key为事件ESection,Value为状态转换函数PRootSection。根据当前状态和当前发生的事件,就可以获得状态转换函数,而状态转换函数中记录了下一状态,和事件处理的方式。
SRoot->addNextState(ESection,PRootSection)
将所有状态和所有事件存在Map集合中,key为该对象的唯一标识,如状态的key为它的name,事件的key为组码组值字符串,知道key就可以从集合中找到该对象。这样就完成了数据的初始化。
步骤三:读取DXF文件进行解析转换
1.设置当前状态currentState为ROOT状态
2.根据用户输入的DXF文件名,创建一个文件句柄f,用以读取文件中的字符。
3.读入一对组码组值,相当于触发事件
4.根据组码和组值可以找到该事件。
5.根据当前状态和当前发生的事件,在该状态的状态转换函数集中就可以获得状态转换函数,而状态转换函数中记录了下一状态,和事件处理的方式。
6.把当前状态设置为从状态转换函数获得的下一状态,并且根据type调用Handle进行事件处理。
7.循环3~6步,直到读入字符为EOF,结束循环。
8.DXF文件解析完毕,程序结束。
以实体段的读取为例:
步骤一:初始状态为ROOT;
步骤二:读入字符为(0,SECTION),根据当前的状态ROOT和当前读入的字符,查找状态转换函数,找到f(ROOT,(0,SECTION))=SECTION,得到下一个状态SECTION,开始进行状态跳转,并执行I型事件处理函数,即输出ROOT开始标签<ROOT>,如果读入的字符不是(0,SECTION)则循环输出<组码>组值</组码>,直到读入(0,SECTION);
步骤三:读入字符为(2,ENTITIES),根据当前的状态SECTION和当前读入的字符,查找状态转换函数,找到f(SECTION,(2,ENTITIES))=ENTITIES,得到下一个状态ENTITIES,开始进行状态跳转,并执行I型事件处理函数,即输出SECTION开始标签<SECTION>,如果读入的字符不是(2,ENTITY)则循环输出<组码>组值</组码>,直到读入(2,ENTITIES);
步骤四:读入字符为(0,*),根据当前的状态ENTITIES和当前读入的字符,查找状态转换函数,找到f(ENTITIES,(0,*))=ENTITY,得到下一个状态ENTITY,开始进行状态跳转,并执行I型事件处理函数,即输出ENTITY状态对应的具体实体的名字作为开始标签,即<*>,这里的*号对应了读入字符中的*号,例如读入(0,Line),*号就代表了Line,这里就应该输出<Line>。如果读入字符为(0,ENDSEC),则根据当前的状态ENTITIES和当前读入的字符,查找状态转换函数,找到f(ENTITIES,(0,ENDSEC))=ROOT,得到下一个状态ROOT,开始进行状态跳转,并执行II型事件处理函数,即输出ENTITY状态对应的具体实体的名字的结束标签以及SECTION的结束标签,即</ENTITIES>和</SECTION>。如果读入的字符不是(0,*)并且也不是(0,ENDSEC)则循环输出<组码>组值</组码>,直到读入(0,*);
步骤五:读入字符为(100,ACDB*),根据当前的状态ENTITY和当前读入的字符,查找状态转换函数,找到f(ENTITIES,(0,ENDSEC))=ROOT,得到下一个状态ENTITYPROPERTY,开始进行状态跳转,并执行I型事件处理函数,即输出ENTITYPROPERTY状态对应的具体实体属性ACDB*的名字作为开始标签,即<ACDB*>,这里的*号对应了读入字符中的*号,例如读入(0,ACDBLine),*号就代表了Line,这里就应该输出<ACDBLine>,如果读入的字符不是(100,ACDB*)则循环输出<组码>组值</组码>,直到读入(100,ACDB*);
步骤六:读入字符为(0,*),根据当前的状态ENTITYPROPERTY和当前读入的字符,查找状态转换函数,找到f(ENTITYPROPERTY,(0,*))=ENTITY,得到下一个状态ENTITY,开始进行状态跳转,并执行II型事件处理函数,即输出ENTITY状态对应的具体实体的名字作为开始标签,即<*>,这里的*号对应了读入字符中的*号,例如读入(0,Line),*号就代表了Line,这里就应该输出<Line>如果读入字符为(0,ENDSEC),则根据当前的状态ENTITYPROPERTY和当前读入的字符,查找状态转换函数,找到f(ENTITYPROPERTY,(0.SECTION))=ROOT,得到下一个状态ROOT,开始进行状态跳转,并执行II型事件处理函数,即输出ENTITYPROPERTY状态对应的具体实体属性的名字的结束标签、实体名字的结束标签、ENTITIES的结束标签以及SECTION的结束标签,即</ACDB*>、</*>、</ENTITIES>和</SECTION>。如果读入的字符不是(0,*)则循环输出<组码>组值</组码>,直到读入(0,*)。
程序中引入了三个堆栈,分别用来存储状态、状态对应的组值、状态对应的组码,之所以要引入三个堆栈,是因为VARIABLE状态下,写入XML文件的是具体的组值,所以需要引入组值存储堆栈;而又因为某些时候,一个标签下面既有子属性又有子标签,所以就需要根据组码来进行子属性和子标签的判断;于是就引入了以上三个存储堆栈,其中状态存储堆栈作为有限状态自动机转换的工作堆栈,存储状态信息,直接支持自动机的工作和格式的装换输出。而组值堆栈和组码堆栈都作为一个辅助堆栈来存储读取进来的组码和组值,用来对输出的XML文件的格式进行一个控制。所以这三个堆栈的数据压入和数据弹出是在相同的时刻,以保持状态和组码组值的正确对应关系。
Claims (1)
1.一种基于DXF文件格式的读取与XML转换的方法,其特征在于:使用3型文法对DXF格式进行描述,使用有限状态自动机根据状态转换图对DXF文件进行解析,在事件发生,状态转移之时,进行事件处理,输出XML格式;其中DXF实体段的五元表达式为M=({ROOT,SECTION,ENTITIES,ENTITY,ENTITYPROPERTY},{(0,SECTION),(2,ENTITY),(0,*),(100,ACDB*),(0,ENDSEC)},f,ROOT,{ROOT});
上面五元表达式中每个变元的具体含义如下:
1){ROOT,SECTION,ENTITIES,ENTITY,ENTITYPROPERTY}代表了五个不同的状态,每一状态都作为程序中状态类的一个具体实例;ROOT为根状态,SECTION为DXF文件结构中的一个段,ENTITIES为DXF文件结构中具体的段结构,,ENTITY为具体的图元类型,ENTITYPROPERTY为子类;
2){(0,SECTION),(2,ENTITY),(0,*),(100,ACDB*),(0,ENDSEC)}代表了五个不同的状态转移事件;
3)f代表了状态转换函数,状态集合用Q表示,输入字符集合用∑表示,状态转换函数是QX∑到Q的映射;
4)ROOT代表了整个有限状态自动机的起始状态;
5){ROOT}代表了整个有限状态自动机的终态集合;
实现有限状态自动机对DXF文件进行解析转换,使用相应的数据结构存储状态,事件以及状态转换函数;在事件发生之时,进行事件处理,事件处理中需要输出XML格式,因此结合XML格式有开始标签必须有结束标签的特性,利用栈的先进后出的原理,使用栈记录向子节点移动的深度,以及每一层的状态,出栈时结束标签,实现XML格式的有效性;
方法步骤如下:
步骤一:初始化状态集、事件集、状态转换函数集,以当前状态为开始状态ROOT;
步骤二:从DXF文件读入一对组值组码,触发事件的产生;
步骤三:根据当前状态和步骤二中读入的组值组码,在当前状态的状态转换函数集中找到下一状态,进行状态转移,把下一状态作为新的当前状态,并且调用事件处理类进行事件处理;
步骤四:循环执行步骤二、步骤三,直到文件读入字符为EOF时,执行步骤五:
步骤五:程序结束,输出XML文件;
所述的状态集为状态的集合,状态包括:唯一标识名字Name;状态转换函数集nextStateTable;
所述的事件集为事件的集合,事件包括组码和组值;
所述的状态转换函数集为状态转换函数的集合,状态转换函数包括:下一状态名StateName,事件处理类型Type;
StateName:记录下一状态;
Type:type为1时,进栈,输出开始标签;type为2时,出栈,输出闭合标签;type为3时,先输出闭合标签,在输出开始标签,栈不动;type为4时,无动作;
所述的事件处理:用作事件处理,决定着输出的格式;
事件处理需要输入参数:组码组值,事件处理类型type,下一状态;
当type=1时,从父节点状态向子节点状态转移时,子节点状态进栈,同时输出该子节点在xml文件中的开始标签,标签名为状态名字;从前列状态向后续状态移动,状态转移的同时读取组码、组值、状态名,并将这三者分别压入对应的堆栈中,同时输出该状态对应在xml文件中的开始标签,标签名为状态名字,,其中VARIABLE状态比较特别,他不会作为标签名,而是以对应该状态的组码值作为标签名;
当type=2时,从子节点状态向祖先节点状态转移时,出栈,同时输出当前出栈状态在XML文件中的闭合标签;循环出栈,直到该祖先状态出栈为止;从后续状态向前列状态移动,状态转移的同时将组码、组值、状态名对应的堆栈中的信息弹出,同时输出该状态对应在xml文件中的闭合标签;
当type=3时,在一个状态转移到自身时,输出前一状态的内容,再输出前一状态在XML文件中的闭合标签,再输出当前状态在XML文件中的开始标签,栈不动;在同一状态自身循环移动,状态转移的同时将前一状态对应的组码、组值、状态名对应的堆栈中的信息弹出,同时输出该子节点在xml文件中的闭合标签,再读取下一状态的组码、组值、状态名,并将这三者分别压入对应的堆栈中,同时输出该状态对应在在xml文件中的开始标签,标签名为状态名字,其中VARIABLE状态比较特别,他不会作为标签名,而是以对应该状态的组码值作为标签名。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010271291XA CN101944080B (zh) | 2010-09-02 | 2010-09-02 | 一种基于dxf文件格式的读取与xml转换的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010271291XA CN101944080B (zh) | 2010-09-02 | 2010-09-02 | 一种基于dxf文件格式的读取与xml转换的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101944080A true CN101944080A (zh) | 2011-01-12 |
CN101944080B CN101944080B (zh) | 2012-06-27 |
Family
ID=43436074
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010271291XA Expired - Fee Related CN101944080B (zh) | 2010-09-02 | 2010-09-02 | 一种基于dxf文件格式的读取与xml转换的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101944080B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105868257A (zh) * | 2015-12-28 | 2016-08-17 | 乐视网信息技术(北京)股份有限公司 | Xml数据解析方法、生成方法以及处理系统 |
CN103645899B (zh) * | 2013-12-12 | 2017-01-11 | 用友网络科技股份有限公司 | 一种将cad中设计数据集成到erp系统的方法 |
CN106484947A (zh) * | 2016-09-08 | 2017-03-08 | 国电南瑞科技股份有限公司 | 基于事件驱动的电网cim/e模型解析方法 |
CN108460056A (zh) * | 2017-02-22 | 2018-08-28 | 电子科技大学中山学院 | 一种dxf文件有效图元转换json数据的方法 |
CN108519882A (zh) * | 2018-04-04 | 2018-09-11 | 中科微至智能制造科技江苏有限公司 | 一种Web端实时浏览CAD文件的方法及系统 |
CN109710808A (zh) * | 2018-12-28 | 2019-05-03 | 深圳市元征科技股份有限公司 | 一种xml文件的解析方法、系统、装置及可读存储介质 |
CN112434502A (zh) * | 2020-11-04 | 2021-03-02 | 西安理工大学 | 一种自动识别螺栓cad工程制图的方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101464865A (zh) * | 2007-12-19 | 2009-06-24 | 新奥特(北京)视频技术有限公司 | 一种基于xml实现编目信息格式转换的系统 |
CN101499067A (zh) * | 2008-02-01 | 2009-08-05 | 英业达股份有限公司 | Linux系统下以Windows格式XML文件取得档案的方法 |
-
2010
- 2010-09-02 CN CN201010271291XA patent/CN101944080B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101464865A (zh) * | 2007-12-19 | 2009-06-24 | 新奥特(北京)视频技术有限公司 | 一种基于xml实现编目信息格式转换的系统 |
CN101499067A (zh) * | 2008-02-01 | 2009-08-05 | 英业达股份有限公司 | Linux系统下以Windows格式XML文件取得档案的方法 |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103645899B (zh) * | 2013-12-12 | 2017-01-11 | 用友网络科技股份有限公司 | 一种将cad中设计数据集成到erp系统的方法 |
CN105868257A (zh) * | 2015-12-28 | 2016-08-17 | 乐视网信息技术(北京)股份有限公司 | Xml数据解析方法、生成方法以及处理系统 |
CN106484947A (zh) * | 2016-09-08 | 2017-03-08 | 国电南瑞科技股份有限公司 | 基于事件驱动的电网cim/e模型解析方法 |
CN108460056A (zh) * | 2017-02-22 | 2018-08-28 | 电子科技大学中山学院 | 一种dxf文件有效图元转换json数据的方法 |
CN108519882A (zh) * | 2018-04-04 | 2018-09-11 | 中科微至智能制造科技江苏有限公司 | 一种Web端实时浏览CAD文件的方法及系统 |
CN109710808A (zh) * | 2018-12-28 | 2019-05-03 | 深圳市元征科技股份有限公司 | 一种xml文件的解析方法、系统、装置及可读存储介质 |
CN109710808B (zh) * | 2018-12-28 | 2023-04-28 | 深圳市元征科技股份有限公司 | 一种xml文件的解析方法、系统、装置及可读存储介质 |
CN112434502A (zh) * | 2020-11-04 | 2021-03-02 | 西安理工大学 | 一种自动识别螺栓cad工程制图的方法 |
CN112434502B (zh) * | 2020-11-04 | 2024-05-28 | 西安理工大学 | 一种自动识别螺栓cad工程制图的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101944080B (zh) | 2012-06-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101944080B (zh) | 一种基于dxf文件格式的读取与xml转换的方法 | |
Gulwani | Programming by examples-and its applications in data wrangling | |
KR101805946B1 (ko) | 입-출력 예시를 사용한 텍스트 조작 프로그램 생성 | |
Chok et al. | Automatic construction of user interfaces from constraint multiset grammars | |
Gil et al. | Formalizing spider diagrams | |
Evans et al. | Making UML precise | |
JPH02109127A (ja) | 仕様処理方法 | |
Khomenko et al. | Detecting state encoding conflicts in STG unfoldings using SAT | |
CN102708161B (zh) | 一种使用公共概念集的数据逻辑模型建模方法 | |
CN102270137B (zh) | 一种获取体系结构描述语言的方法和一种建模工具 | |
Carayol et al. | Choice functions and well-orderings over the infinite binary tree | |
Butler et al. | Retrieving information from data flow diagrams | |
Miao et al. | Formalizing UML models with Object-Z | |
Rajbhoj et al. | DocToModel: automated authoring of models from diverse requirements specification documents | |
CN109977514B (zh) | 一种雷达同步数据流图模型调度序列生成方法 | |
Ehrig et al. | Model transformation from visualocl to ocl using graph transformation | |
Simic et al. | Prospects of encoding Java source code in XML | |
Kamareddine et al. | Computerising Mathematical Text. | |
Cheng et al. | Ontology mapping between PSL and XML-based standards for project scheduling | |
Björklund et al. | Bounded depth data trees | |
Dockins et al. | Multimodal separation logic for reasoning about operational semantics | |
Zapata et al. | A rule-based system for assessing consistency between UML models | |
Zhou et al. | $ R^ 3$-NL2GQL: A Model Coordination and Knowledge Graph Alignment Approach for NL2GQL | |
Sreeramulu et al. | A new methodology for recognition of milling features from STEP File | |
Clairambault | Bounding skeletons, locally scoped terms and exact bounds for linear head reduction |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120627 Termination date: 20150902 |
|
EXPY | Termination of patent right or utility model |