本发明一般涉及图形化编程领域,具体涉及一种图形化编程的控制与存储。
背景技术:
随着社会的发展,人们生活水平的不断提高,同时计算机技术的飞速发展,软硬件编程已不再是IT人员的专职工作,编程者可能来自于社会上各行各业。同时在儿童的计算机早期教育中,对于儿童编程思想的培养也对编程语言使用的难易程度改进进一步地提出了需求。在乔布斯遗失的录像里,他说到每个人都应该学习编程,因为编程能促进大脑的思考,让人考虑问题更加周全。但事实上,程序逻辑的复杂,编程语言语法的繁多,仍然让非计算机相关专业的人们感到难以企及。而对非计算机软硬件相关专业机器人发烧友而言,作为使用电脑人群中的特殊群体,如果将软件烧写在固定的芯片里,不能给他们一定的创造空间,这也已经不能满足他们的需求。开发可编程以创造属于自己的作品,同时易于使用的平台是解决这个燃眉之急的唯一途径。
现有的图形化编程软件并不常见,而且大都形式固定,可提供给用户编程使用的组件有限,过于专业,学习成本高,用户仍然需要花费很多时间才能弄懂图形化编程系统如何使用,且系统本身效率不高,既费时费力,效果也不佳。
技术实现要素:
本发明针对当前图形化编程领域技术的不足,提供了一种图形化编程控制与存储系统。本发明的目的在于提供一种高效实用且操作简单的图形化编程控制与存储系统,能够让使用人员通过拖动图形化编程组件从而完成复杂的编程工作,系统最后会生成制定语言或可执行程序,从而实现编程的图形化。
一种图形化编程控制与存储系统,其包括中心控制模块、与所述中央控制模块连接的显示模块、消息响应模块、图形化编程组件间操作模块、图形化编程组件内操作模块、项目属性及控制模块、自定义组件模块、项目持久化模块和编译模块;所述中心控制模块处于整个系统的中心地位,负责处理、存储和返回传递过来的信息和结果;所述显示模块用于直观显示图形化编程组件,并接收来自用户的操作,将操作消息传递至消息响应模块,以及显示结果;所述消息响应模块用于分发消息到中心控制模的对应部分进行处理和将消息处理结果返回消息源,完成连接作用;所述图形化编程组件间操作模块主要负责图形化编程组件与组件之间的组织关系和信息的控制与存储;所述图形化编程组件内操作模块用于编程组件内部参数及其他信息的读取、修改和存储;所述项目属性及控制模块用于项目的创建、销毁以及项目属性的读取、修改和存储;所述自定义组件模块用于在已有图形化编程组件上再创建自定义的函数或图形化编程组件;所述项目持久化模块用于将项目信息持久化到磁盘以及将已有信息读取出来;所述编译模块用于将用户编写好的图形化代码编译成其他语言或可执行程序,生成最终结果。
进一步地,所述图形化编程组件包括:控制外设组件(如完成简单功能的传感器组件),常量、变量和完成逻辑功能的循环组件,选择分支组件,以及能够完成创建自定义的函数或复合功能图形化编程组件的自定义组件。
进一步地,中心控制模块与显示模块之间通过消息响应模块连接,消息响应模块将消息分发给中心控制模,中心控制模处理完毕之后将结果传递给消息响应模块,消息响应模块再将消息返回到消息源。
进一步地,中心控制模块包括项目集合,每个项目包括本项目中的所有程序集合、自定义集合和变量集合;每个程序包括本程序中所有描述组件间关系的组件树集合、描述组件内部信息的组件实体集合、描述组件间参数赋值的参数连线集合。
进一步地,描述组件间关系的组件树集合,与描述组件内部信息的组件实体集合分开存储,但在逻辑上每个程序中内部的每一组以1开始自增的序列号方式唯一标识,一一对应;在每个程序中提供树到组件的索引,并提供组件到树的反向索引以提高查询速度;树编号即是该树树根编号。
进一步地,所述循环组件中包含循环条件、循环次数和存在于该循环组件中的组件树编号即该树树根编号集合,同时提供树到循环组件编号的反向索引以提高查询速度,循环组件能够嵌套循环组件、选择分支组件或自定义组件;所述选择分支组件中包括分支条件、多个选择分支,每个分支中包括存在于该选择分支组件中的组件树编号集合,同时提供树到循环组件编号的反向索引以提高查询速度,选择分支组件能够嵌套循环组件、选择分支组件或自定义组件。
进一步地,所述循环组件有且只有一棵最终参与编译的激活树,该树的编号计算方法是I=IDmodule*ACTIVE_TREE_MAP_FACTOR,其中I为激活树编号,IDmodule为模块编号,ACTIVE_TREE_MAP_FACTOR取100000;所述选择分支组件的每个分支中有且只有一棵最终参与编译的激活树,该树的编号计算方法是I=IDmodule*ACTIVE_TREE_MAP_FACTOR+IDmodule,其中I为激活树编号,IDmodule为模块编号,ACTIVE_TREE_MAP_FACTOR取100000,IDmodule为分支编号。
进一步地,所述自定义组件模块能够组合多个已有编程组件为一个新的编程组件,包括存在于本自定义组件中所有描述组件间关系的组件树集合、描述组件内部信息的组件实体集合、描述组件间参数赋值关系的参数连线集合;自定义组件能够嵌套循环组件、选择分支组件或自定义组件。
进一步地,所述图形化编程组件间操作模块包括模块的插入、查找、移动和删除操作;所述插入操作包括以下步骤:
(a)用户发起一个插入新组件指令;
(b)消息响应模块接收到(a)的消息,找到负责插入操作的中心控模块函数,判断插入类型是后置插入还是前置插入;如果插入类型为后置插入,将待插入组件的前驱模块编号传入该中心控制模块函数;否则将待插入组件的后继模块编号传入该中心控制器函数;
(c)中心控制模块将相应程序中已有的最大组件编号加1,作为即将插入的新组件的编号;
(d)如果为后置插入,判断前驱节点的编号是否为0,如果为0,就新生成一棵树,新插入节点作为该树树根;如果前驱节点的编号不为0,且前驱节点后方有节点,需要先将后方节点断开,将新节点插入在前驱节点的后方,再将原后方节点接在新节点后方;如果前驱节点的编号不为0,且前驱节点后方没有节点,则将新节点直接接在前驱节点后方;如果为前置插入,判断后继节点是否为0,如果为0,就新生成一棵树,新插入节点作为该树树根;判断后继节点是否为该树树根,如果为树根,则将新插入节点换做本树树根,更新组件到树的映射索引;否则不允许前置插入;如果需要插入到完成逻辑功能的循环组件、选择分支组件中,还需要更新树到逻辑功能组件的映射索引;
(e)在持久化模块的组件初始化子模块中找到该组件的初始化信息,初始化模块内部信息;
(f)通过消息响应模块反馈结果;
所述移动操作包括以下步骤:
(g)用户发起一个移动组件指令;
(h)消息响应模块接收到(g)的消息,找到负责移动操作的中心控制器函数,判断移动类型是单组件后置移动、单组件前置移动,还是多组件后置移动、多组件前置移动;如果为单组件后置移动,需要将待移动组件编号和待插入位置的前驱组件编号传入该中心控制器函数;如果为单组件前置移动,需要将待移动组件编号和待插入位置的后继组件编号传入该中心控制器函数;如果为多组件后置移动,需要将所有待移动组件编号和待插入位置的前驱组件编号传入该中心控制器函数;如果为多组件前置移动,需要将所有待移动组件编号和待插入位置的后继组件编号传入该中心控制器函数;
(i)如果为单组件移动,断开待移动组件节点已有的连接,如果待移动节点有后继节点,后继节点直接接在删除节点前驱节点上;如果为多组件移动,断开所有非线连接的选定组件节点与前驱节点的连接,如果待移动节点连通域无分叉,且有后继节点,后继节点直接接在删除节点前驱节点上;如果待移动节点连通域有分叉,且有后继节点,直接断开后继节点与其前驱的节点的连接,并将这些后继节点生成新的树;
(j)如果为单组件移动,且为后置移动,判断前驱节点的编号是否为0,如果为0,就新生成一棵树,新移动节点作为该树树根;如果前驱节点的编号不为0,且前驱节点后方有节点,需要先将后方节点断开,将新节点移动到前驱节点的后方,再将原后方节点接在新节点后方;如果前驱节点的编号不为0,且前驱节点后方没有节点,则将新节点直接接在前驱节点后方;如果为前置移动,判断后继节点是否为0,如果为0,就新生成一棵树,新移动节点作为该树树根;判断后继节点是否为该树树根,如果为树根,则将新移动节点换做本树树根,更新组件到树的映射索引;否则不允许前置插入;如果需要移动到完成逻辑功能的循环组件、选择分支组件中,还需要更新树到逻辑功能组件的映射索引;如果为多组件移动,只用将鼠标选定的同一连通域的组件进行移动;判断该连通域内组件是否有分叉,如果没有分叉,将整个连通域当做一个组件,移动方式同单模块移动;如果有分叉,只能后置移动于已有树的叶子节点处,否则移动失败;
(k)通过消息响应模块反馈结果;
所述删除操作包括以下步骤:
(l)用户发起一个删除组件指令;
(m)消息响应模块接收到(l)的消息,找到负责删除操作的中心控制器函数,将待删除组件编号传入该中心控制器函数;
(n)断开待删除组件节点已有的连接并删除该节点,如果待删除节点有后继节点,后继节点直接接在删除节点前驱节点上;
(o)删除组件内部信息,如果是删除完成逻辑功能的循环组件、选择分支组件,还需要删除组件内所有树节点及对应组件信息和嵌套逻辑组件,并更新映射索引;
(p)通过消息响应模块反馈结果。
进一步地,所述持久化模块包括组件初始化子模块和用户信息子模块;组件初始化子模块包括所有组件内部的初始化信息;用户信息子模块负责读取和写入用户保存的组件间信息和组件内部信息;只需要编写新增组件初始化信息持久化文件,并将其加入到组件初始化子模块中,实现图形化编程组件的动态扩展,而无需重新编译项目。
与现有技术相比,本发明具有如下优点和技术效果:
现有的图形化编程系统,他们大都在同一个图形化开源框架上进行修改,不论是在图形界面上还是在实现上都并没有太大的创新,而且可提供给用户编程使用的组件有限,过于专业,学习成本高,且系统本身效率不高,效果不佳。国内图形化编程软件更为匮乏。针对上述问题,本发明允许用户通过简单的操作就可以实现复杂的编程操作,让用户精力集中在实现自己的编程思想上。另外系统具有相当的扩展性,不仅能够动态扩展图形化编程组件,还能够与硬件外设或者机器人相结合,拖动界面上的图标,就能完成软件或者硬件的操作,而且系统结构清晰,简单高效,能够作为很多图形化编程软件的控制和存储核心,使用户更容易高效的使用图形化编程软件。
附图说明
图1为实施方式中一种图形化编程控制与存储系统的系统组成示意图。
图2为实施方式中一种图形化编程控制与存储系统插入操作的流程图。
图3为实施方式中一种图形化编程控制与存储系统移动操作的流程图。
具体实施方式
以下结合附图对本发明的实施方式作进一步说明,但本发明的实施不限于此,需指出的是,以下若有为特别详细说明之过程,均是本领域技术人员可参照现有技术实现的。
如图1,一种图形化编程控制与存储系统包括:中心控制模块,与所述中央控制模块连接的显示模块、消息响应模块、图形化编程组件间操作模块、图形化编程组件内操作模块、项目属性及控制模块、自定义组件模块、项目持久化模块和编译模块;所述中心控制模块处于整个系统的中心地位,负责处理、存储和返回传递过来的信息和结果;所述显示模块用于直观显示图形化编程组件,并接受来自用户的操作,将操作消息传递至消息响应模块,以及显示结果;所述消息响应模块用于分发消息到中心控制器的对应部分进行处理和将消息处理结果返回消息源,完成连接作用;所述图形化编程组件间操作模块主要负责图形化编程组件与组件之间的组织关系和信息的控制与存储;所述图形化编程组件内操作模块用于编程组件内部参数及其他信息的读取、修改和存储;所述项目属性及控制模块用于项目的创建、销毁以及项目属性的读取、修改和存储;所述自定义组件模块用于在已有图形化编程组件上再创建自定义的函数或图形化编程组件;所述项目持久化模块用于将项目信息持久化到磁盘,与将已有信息读取出来;所述编译模块用于将用户编写好的图形化代码编译成其他语言或可执行程序,生成最终结果。
所述图形化编程组件包括完成简单功能的传感器组件等控制外设组件、常量、变量和完成逻辑功能的循环组件、选择分支组件,以及能够完成创建自定义的函数或复合功能图形化编程组件的自定义组件。
中心控制模块与显示模块不直接连接,而是通过消息响应模块连接,消息响应模块将消息分发给中心控制器,中心控制器处理完毕之后将结果传递给消息响应模块,消息响应模块再将消息返回到消息源。
中心控制模块包括项目集合,上述每个项目包括本项目中的所有程序集合、自定义集合和变量集合。
所述每个程序包括本程序中所有描述组件间关系的组件树集合、描述组件内部信息的组件实体集合、描述组件间参数赋值的参数连线集合。
描述组件间关系的组件树集合,与描述组件内部信息的组件实体集合分开存储,但在逻辑上通过每个程序中内部的一组从1开始自增的序列号唯一标识,一一对应;在每个程序中提供树到组件的索引,并提供组件到树的反向索引以提高查询速度;树编号即是该树树根编号。
所述循环组件中包含循环条件、循环次数和存在于该循环组件中的组件树编号(该树树根编号)集合,同时提供树到循环组件编号的反向索引以提高查询速度,循环组件能够嵌套循环组件、选择分支组件或自定义组件;所述选择分支组件中包括分支条件、多个选择分支,每个分支中包括存在于该选择分支组件中的组件树编号集合,同时提供树到循环组件编号的反向索引以提高查询速度,选择分支组件能够嵌套循环组件、选择分支组件或自定义组件。
所述循环组件有且只有一棵最终参与编译的激活树,该树的编号计算方法是I=IDmodule*ACTIVE_TREE_MAP_FACTOR,其中I为激活树编号,IDmodule为模块编号,ACTIVE_TREE_MAP_FACTOR取100000;例如IDmodule为9时,激活树编号I=9*100000=900000。所述选择分支组件的每个分支中有且只有一棵最终参与编译的激活树,该树的编号计算方法是I=IDmodule*ACTIVE_TREE_MAP_FACTOR+IDmodule,其中I为激活树编号,IDmodule为模块编号,ACTIVE_TREE_MAP_FACTOR取100000,IDmodule为分支编号;例如IDmodule为9,IDmodule为3时,激活树编号I=9*100000+3=900003。
所述自定义组件模块能够组合多个已有编程组件为一个新的编程组件,包括存在于本自定义组件中所有描述组件间关系的组件树集合、描述组件内部信息的组件实体集合、描述组件间参数赋值关系的参数连线集合;自定义组件能够嵌套循环组件、选择分支组件或自定义组件。
所述图形化编程组件间操作模块包括模块的插入、查找、移动和删除操作。
所述插入操作包括以下步骤:
(a)用户发起一个插入新组件指令;
(b)消息响应模块接收到(a)的消息,找到负责插入操作的中心控制器函数,判断插入类型是后置插入还是前置插入。如果插入类型为后置插入,将待插入组件的前驱模块编号传入该中心控制器函数;否则将待插入组件的后继模块编号传入该中心控制器函数;
(c)中心控制器将相应程序中已有的最大组件编号加1,作为即将插入的新组件的编号;
(d)如果为后置插入,判断前驱节点的编号是否为0,如果为0,就新生成一棵树,新插入节点作为该树树根;如果前驱节点的编号不为0,且前驱节点后方有节点,需要先将后方节点断开,将新节点插入在前驱节点的后方,再将原后方节点接在新节点后方;如果前驱节点的编号不为0,且前驱节点后方没有节点,则将新节点直接接在前驱节点后方。如果为前置插入,判断后继节点是否为0,如果为0,就新生成一棵树,新插入节点作为该树树根;判断后继节点是否为该树树根,如果为树根,则将新插入节点换做本树树根,更新组件到树的映射索引;否则不允许前置插入。如果需要插入到完成逻辑功能的循环组件、选择分支组件中,还需要更新树到逻辑功能组件的映射索引;
(e)在持久化模块的组件初始化子模块中找到该组件的初始化信息,初始化模块内部信息;
(f)通过消息响应模块反馈结果。
所述移动操作包括以下步骤:
(g)用户发起一个移动组件指令;
(h)消息响应模块接收到(g)的消息,找到负责移动操作的中心控制器函数,判断移动类型是单组件后置移动、单组件前置移动,还是多组件后置移动、多组件前置移动。如果为单组件后置移动,需要将待移动组件编号和待插入位置的前驱组件编号传入该中心控制器函数;如果为单组件前置移动,需要将待移动组件编号和待插入位置的后继组件编号传入该中心控制器函数;如果为多组件后置移动,需要将所有待移动组件编号和待插入位置的前驱组件编号传入该中心控制器函数;如果为多组件前置移动,需要将所有待移动组件编号和待插入位置的后继组件编号传入该中心控制器函数;
(i)如果为单组件移动,断开待移动组件节点已有的连接,如果待移动节点有后继节点,后继节点直接接在删除节点前驱节点上;如果为多组件移动,断开所有非线连接的选定组件节点与前驱节点的连接,如果待移动节点连通域无分叉,且有后继节点,后继节点直接接在删除节点前驱节点上;如果待移动节点连通域有分叉,且有后继节点,直接断开后继节点与其前驱的节点的连接,并将这些后继节点生成新的树;
(j)如果为单组件移动,且为后置移动,判断前驱节点的编号是否为0,如果为0,就新生成一棵树,新移动节点作为该树树根;如果前驱节点的编号不为0,且前驱节点后方有节点,需要先将后方节点断开,将新节点移动到前驱节点的后方,再将原后方节点接在新节点后方;如果前驱节点的编号不为0,且前驱节点后方没有节点,则将新节点直接接在前驱节点后方。如果为前置移动,判断后继节点是否为0,如果为0,就新生成一棵树,新移动节点作为该树树根;判断后继节点是否为该树树根,如果为树根,则将新移动节点换做本树树根,更新组件到树的映射索引;否则不允许前置插入。如果需要移动到完成逻辑功能的循环组件、选择分支组件中,还需要更新树到逻辑功能组件的映射索引。如果为多组件移动,只用将鼠标选定的同一连通域的组件进行移动。判断该连通域内组件是否有分叉,如果没有分叉,将整个连通域当做一个组件,移动方式同单模块移动;如果有分叉,只能后置移动于已有树的叶子节点处,否则移动失败;
(k)通过消息响应模块反馈结果。
所述删除操作包括以下步骤:
(l)用户发起一个删除组件指令;
(m)消息响应模块接收到(l)的消息,找到负责删除操作的中心控制器函数,将待删除组件编号传入该中心控制器函数;
(n)断开待删除组件节点已有的连接并删除该节点,如果待删除节点有后继节点,后继节点直接接在删除节点前驱节点上;
(o)删除组件内部信息,如果是删除完成逻辑功能的循环组件、选择分支组件,还需要删除组件内所有树节点及对应组件信息和嵌套逻辑组件,并更新映射索引;
(p)通过消息响应模块反馈结果。
所述持久化模块包括组件初始化子模块和用户信息子模块。组件初始化子模块包括所有组件内部的初始化信息;用户信息子模块负责读取和写入用户保存的组件间信息和组件内部信息。
只需要编写新增组件初始化信息持久化文件,并将其加入到组件初始化子模块中,就可以实现图形化编程组件的动态扩展,而无需重新编译项目。
然后通过组件内信息,使用编译模块对组件进行编译;并通过组件间信息,使用编译模块对组件进行链接,将用户编写好的图形化代码生成其他语言或可执行程序。