AutoLisp语言在节理玫瑰花图制作中的应用

2011-04-10 00:40刘海心河南省水利勘测设计研究有限公司
河南水利与南水北调 2011年12期
关键词:数组节理玫瑰花

□刘海心(河南省水利勘测设计研究有限公司)

引言

随着计算机辅助制图技术的不断发展,美国AutoDesk公司的AutoCAD已成为制图人员的一件利器,然而大量的重复性工作又使得制图人员为之头痛,AutoLisp语言能够通过编程大量成批地去解决这一问题。在水利工程地质勘察中,节理的统计是至关重要的,需要将一批节理先按走向进行统计,再在走向统计结果的基础上进行倾向和倾角的统计,统计结果形成玫瑰花图。统计过程非常烦琐,并容易出错,形成玫瑰花图也同样费时费力,若有成百上千条节理,那手工统计几乎难以完成。应用AutoLisp语言对节理进行统计并自动将统计结果生成CAD图件,将使工作事半功倍。

一、AutoLisp语言特点

AutoLisp语言是一种运行在AutoCAD环境下的Lisp编程语言,或称为AutoCAD的一种嵌入式语言,是一种能以直译方式 (不须先行编译)亦可于AutoCAD内部执行的直译性程序语言。它采用了与CommandLisp(一种通用的Lisp语言版本)相近的语法及习惯约定,并吸收了Lisp语言的主要函数,同时增加了针对AutoCAD特点的许多功能,如:可以把AutoLisp和Auto-CAD的绘图命令透明地结合起来,使设计和绘图完全融为一体。利用AutoLisp语言编程可以实现对AutoCAD当前图形数据库进行直接访问和修改。在Lisp语言中,最基本的数据类型是符号表达式,lisp语言的特点是程序和数据都采用符号表达式的形式,即一个lisp程序可以把另一个lisp程序作为它的数据进行处理,因此使用lisp语言十分灵活,看起来是一个一个的函数调用。支持递归定义也是AutoLisp语言的重要特点。

AutoLisp语言是提供给用户的主要二次开发工具之一,用AutoLisp编写应用程序,可以为AutoCAD增加新的命令或修改AutoCAD,以适应用户的特殊需要。掌握使用和编制AutoLisp应用程序的方法和技术将大大提高用户的工作效率和二次开发水平,增强AutoCAD的灵活性,并将得到长期、稳定的技术支持。

AutoLisp语言是由COMMON LISP语言的一个子集再增加一些与图形处理有关的特殊函数组成,并内嵌在AutoCAD之中,即是嵌入AutoCAD内部的通用LGP程序设计语言的子集。Auto Lisp语言灵活简洁、表达能力强,通过定义函数实现各种功能。除可以完成各种科学计算外,还能调用AutoCAD各项命令,直接访问图形数据,从而大大地扩充了图形处理功能。

但由于Auto Lisp语言是一种解释语言,其保密性差、运行速度慢、自顶而下的程序设计思想、调试不便等缺点使得它不适合开发大型的计算密集型的系统。而且,它与目前推广的OOP(面向对象程序设计)技术并不兼容,另外,其表达式的表示法也不易让一般开发人员习惯和接受。

二、节理玫瑰花图简介

一种用以表示节理空间方位及其发育程度的图解。其作法是:首先对一定地区范围内的节理进行系统测量,将测得的节理产状及密度数据按空间方位间隔分组(如5°或10°为一组),求出每组的节理数量和平均走向(或倾向)。然后在节理走向玫瑰花图标明地理方位的圆内,以半径方向表示节理方位,以半径上的长度单位表示该组节理的数量,将各组节理投入图上,连接相邻各投影点(如某一方位无节理,则连至圆心),即得到节理玫瑰花图。表示节理走向的图叫走向玫瑰花图,只作上半圆;在节理最发育的方向上(一组或二组),引一延长线,将其划分为90°,根据这组节理所具有的倾角、倾向和条数,按一定比例绘在延长线上。

三、算法

首先读入节理的走向、倾向和倾角,读入后,要进行分组,走向若以10°分组,组号为0~35,倾向分为五组,分别为用A、B、C、D、E,分别对应四个象限,若倾角为90°,则为E组。倾角以10°分组,组号为0~8,分组后,就可将读入的产状进行分组统计。比如某一节理走向为10°,倾向为100°,倾角为36°,读入后,将走向10°放入SumStrike2和NStrike2、AverageStrike中分别进行累加、计数及求平均值,其中2表示走向的第2组;100°对应象限为第二象限,也就是倾向SE,为B;倾角为36°,将其放入 B2SumAngle、B2NAngle、B2AverageTrendAngle分别进行累加、计数及求平均值。

读入完所有的产状后,将统计结果分别放入以上相应的变量中后,要求出走向最多的分组,才能在此走向分组上进行倾向和倾角的统计。而走向最多的分组是不确定的,可能为1个,也可能为2个,甚至更多,这样就必须将最多的分组存入一个字符串中,每个分组间用一个标识符隔开,比如走向第5组、第10组和第20组都为15个节理,为各个组中的最多,这样字符串为5B10B15B,其中B为标识符,这样就可以确认哪几个分组为最多的节理分组。

各个分组的统计结果要存入到变量中,这个变量应以数组的方式存在,但AutoLisp语言不支持数组,只能以动态变量来表达。用循环将变量后增加一个数做为一个新的变量,这个数是可以变化的,这样,再把统计结果放到这些新的变量中,就可达到动态数组的目的,如A变量,增添后为A1、A2、A3……等。

统计结束后,利用三角函数将走向线终点以及最长走向线所对应的两个倾向的倾角顶点坐标求出,然后将相邻的坐标点连接起来,不相邻的孤立坐标点和原点相连。这里涉及到许多初等数学的几何关系,不再赘述。

四、结语

AutoLisp语言编程能够替代部分重复的、烦琐的手工制图,使得工作效率提高,事半功倍。AutoLisp语言和一般的编程语言在语法上不太一样,并且不支持数组,使用起来很不习惯,不过它支持选择集,可以代替数组。本文提到的动态设置变量也可以替代数组质,对于初学者来说,动态设置变量相对选择集要较容易掌握,采用AutoLisp语言编制程序绘制节理玫瑰花图,重要的是进行分组统计,并进行编码标识。

猜你喜欢
数组节理玫瑰花
JAVA稀疏矩阵算法
顺倾节理边坡开挖软材料模型实验设计与分析
新疆阜康白杨河矿区古构造应力场特征
JAVA玩转数学之二维数组排序
玫瑰花
新疆阜康白杨河矿区构造节理发育特征
玫瑰花盛开
Excel数组公式在林业多条件求和中的应用
Effect of Magnetic Field on Forced Convection between Two Nanofluid Laminar Flows in a Channel
寻找勾股数组的历程