2006年10月23日星期一

利用Lisp绘制Spirograph曲线

还记得小时候玩过的一种玩具么?一个塑料板上有带内齿轮大圆形,一系列上面带有孔的小齿轮,把铅笔套在小齿轮的孔上,让小齿轮沿着大内齿轮滚动,于是,笔画出了一道漂亮的曲线。不大记得这种玩具叫什么名字了,好像叫“万花筒”?,今天才知道这种玩具的英文名叫“spirograph”,于是找了一下资料,发现外国的品种要多一些。如下图所示。

由于小时候挺喜欢这种玩具也很喜欢几何,而在学习Lisp之初,就用Lisp编了如下一段简单的小程序,最近整理东西的时候才发现,贴贴让大家娱乐一下:)

这种曲线应该和机械的有点关系,假如一个圆沿着一条直线走的话,那么圆内(不一定是圆周)某一点形成的轨迹应该叫滚轮线,似乎和悬链线及最速降线有点关系,而圆沿着一个圆周走,照查询的资料应该叫spirograph-螺旋型星云线,而若其沿着一个封闭的曲线走,应该更复杂一下,反正是按照一种等距离量测的方法在走动。

本程序简单利用参数方程的方法构建,纯属娱乐,毫无作用,见笑了:)

原理




;;; ========================================================================
;;; The following code are writen by qjchen ;
;;; 华南理工大学 建筑学院 ;
;;; Http://qjchen.googlepages.com ;
;;; ========================================================================
(defun c:test (/ lst r1 r2 r3 r4 color alpha beta orign orignx orignyp1 p2)


(setq lst (getpattern)
r1 (nth 0 lst)
r2 (nth 1 lst)
r3 (nth 2 lst)
r4 (- r1 r2)
color (nth 3 lst)
alpha 0
beta 0
orign (getpoint "\n the original point:")
orignx (car orign)
origny (cadr orign)
)
(command "color" color "")
(while (< beta 314)
(setq alpha (* -1 (* beta (/ r2 (+ r4 r2)))))
(setq p1 (list (+ orignx (* r4 (cos alpha)) (* r3 (cos beta)))
(+ origny (* r4 (sin alpha)) (* r3 (sin beta)))
0
)
)
(setq beta (+ beta 0.05))
(setq alpha (* -1 (* beta (/ r2 (+ r4 r2)))))
(setq p2 (list (+ orignx (* r4 (cos alpha)) (* r3 (cos beta)))
(+ origny (* r4 (sin alpha)) (* r3 (sin beta)))
0
)
)
(command "line" p1 p2 "")
)
)
(defun getpattern (/ kword pattern pattern1)
(initget "1 2 3 4 5 6 7 8 9 10")
(setq kword (getkword "\n please select the type: 1/2/3/4/5/6/7/8/9/10:"))
(cond
((= kword "1")
(setq res (list 20.0 14.3 7 1))
)
((= kword "2")
(setq res (list 20.0 14.3 15 2))
)
((= kword "3")
(setq res (list 20.0 10.3 5 3))
)
((= kword "4")
(setq res (list 20.0 12 8 4))
)
((= kword "5")
(setq res (list 20.0 9 1 5))
)
((= kword "6")
(setq res (list 20.0 9 5 131))
)
((= kword "7")
(setq res (list 20.0 9 7 30))
)
((= kword "8")
(setq res (list 20.0 8 5 220))
)
((= kword "9")
(setq res (list 20.0 5.2 4.2 170))
)
((= kword "10")
(setq res (list 20.0 5.2 2.2 140))
)
)
res
)



效果 [img]http://qjchen.googlepages.com/HELISCOPE.png[/img]


修改一下,改成变颜色和画圆,得到如下的结果和图形


;;; ========================================================================
;;; The following code are writen by qjchen ;
;;; 华南理工大学 建筑学院 ;
;;; Http://qjchen.googlepages.com ;
;;; ========================================================================

(defun c:test1 (/ lst r1 r2 r3 rad color alpha beta orign orignx orignyp1
p2 rep add)
(setq lst (getpattern1)
r1 (nth 0 lst)
r2 (nth 1 lst)
r3 (nth 2 lst)
rad (nth 3 lst)
rep (nth 4 lst)
add (nth 5 lst)
alpha 0
beta 0
orign (getpoint "\n the original point:")
orignx (car orign)
origny (cadr orign)
)
(entmake (list (cons 0 "CIRCLE")
(cons 6 "BYLAYER")
(cons 8 "0")
(cons 10 orign)
(cons 40 r1)
(cons 62 8)
)
)
(setq i 1)
(setq color 10)
(command "color" color "")
(while (< beta rep)
(if (> beta (* add i))
(progn
(setq i (+ i 1))
(setq color (+ color 10))
(command "color" color "")
)
)
(setq alpha (* -1 (* beta (/ r2 (+ r1 r2)))))
(setq x1 (+ orignx (* r1 (cos alpha)) (* r3 (cos beta))))
(setq y1 (+ origny (* r1 (sin alpha)) (* r3 (sin beta))))
(setq p1 (list x1 y1 0.0))
(setq beta (+ beta 0.05))
(entmake (list (cons 0 "CIRCLE")
(cons 6 "BYLAYER")
(cons 8 "0")
(cons 10 p1)
(cons 40 rad)
(cons 62 color)
)
)

)
)
(defun getpattern1 (/ kword pattern pattern1)
(initget "1 2")
(setq kword (getkword "\n please select the type: 1/2:"))
(cond
((= kword "1")
(setq res (list 20.0 14.3 7 0.2 75.2 3.14))
)
((= kword "2")
(setq res (list 20.0 15 15 1 44 2.14))
)
)
res
)


效果:

[img]http://qjchen.googlepages.com/HELISCOPE3.png[/img]

2006年10月22日星期日

DCL&Lisp Generator Lite 2.1试用记录

曾经在这个帖子中写过试用日记
http://www.xdcad.net/forum/showthread.php?s=&threadid=581242

之前在它网站老是没有看到下载的地方,还以为它在吊人胃口呢
刚才试用了一下,感受它的一些思路,感触如下
1。程序思路还是很好的
采用可视化的dcl界面(对话框编辑器),还有dcl编辑器和lisp编辑器的功能,拖动控件到对话框编辑器中,按generate code可以产生相应的dcl代码。程序用了upx加壳。
2. code generator中有不少直接输入getpoint, draw arc,ssget的函数,这个倒也挺方便输入的。还具有函数自动补齐功能(不过好像和我的拼音输入法冲突,没有试验成功)
3.dwg2lsp的功能可以把图形转换成dwg,其实这个应该不难实现的,但确实思想很有趣,感觉有点象写出dxf的感觉

lite版的限制很多,
1.比如无法生成group column, column, image list 和radiobutton group等的dcl代码,似乎其他控件的宽度调节也有问题
2. dcl 编辑器和lisp编辑器的功能除了高亮和函数自动补齐之外,似乎功能不强,当然可能和程序的本意有关
3.太多的诸如生成文本,生成圆,选择实体等实用语句不能在Lite版使用

总体而言,是个挺有创意的程序,要是用好,说不定能提高效率,也说不定某些功能值得我们自己去试试看能否自己做出来。

Diana的学习和应用

Diana的学习和应用

公司官方介绍:
Displacement analyser (Diana)
DIANA是由荷兰的TNO DIANA公司开发的通用有限元结构分析软件包。
  该软件以土木建筑工程为主,在世界各地拥有很高的声誉。 特别是在混凝土的裂缝开展分析,钢结构的局部稳定分析, 复合结构的极限承载力分析,地基的分段施工分析等非线性分析方面,得到了广大用户的高度评价。
2003年1月,建筑研究所负责开发DIANA软件的部门从荷兰应用科学研究所独立出来, 与英国的FEMSYS公司合并,成立了TNO DIANA公司. 该公司是荷兰应用科学研究所下属的百分之百的子公司。
分析类型:
线弹性静力分析(Linear Static Analysis)
特征值分析(Eigenvalue Analysis)
稳定分析(Euler Buckling Analysis)
非线性分析(Nonlinear Analysis)
静力问题 动力问题
材料非线性 几何非线性
动力分析(Dynamic Analysis)
频谱响应分析 时程响应分析
分段施工分析(Phased Analysis)
热传导分析、渗透分析:【线性、非线性问题、稳态分析、瞬态分析、与应力分析的连动】
流体-应力分析:[热应力分析、压密分析]
Lattice分析
管道线分析(Pipeline Analysis)
逆向分析(Parameter Estimation Analysis)
地基基础的液化分析(3种本 模型) (Liquefaction Analysis)
混凝土弹塑性断裂模型(Maekawa Model)


单元类型:
杆单元
梁单元
平面应力单元
平面应变单元
轴对称单元
弯曲板单元
平面壳单元
曲面壳单元
固体单元
界面单元
弹簧单元
结点质量单元
埋入式钢筋单元
流体单元
边界单元
埋入式钢筋单元

材料特性:
各向同性/各向异性材料
非线性弹性分析
弹塑性分析
粘塑性分析
粘弹性徐变分析
干燥收缩分析
裂缝分析(分散型裂缝模型,
离散型裂缝模型)
超弾性問題
界面单元的非线性材料特性
用户定义子程序功能
混凝土弹塑性断裂模型
钢材的移动硬化准则

载荷:
载荷
集中载荷
分布载荷
重力
离心力
位移载荷
钢筋单元的预应力
风载荷
水载荷
加速度
各种单元的初始应力

初始条件:
变形
自重应力(K0状态)
初始应力
初始速度
失稳后的変形

我的学习心得:
零零散散地学了一段时间的Diana,也不知道入门了没有
下面是我对Diana的一些肤浅的认识
优点:
1.对于钢筋的处理有其独到之处,可以比较简单的加入分离式的钢筋,并施加预应力。
2.对于混凝土的本构模型,有比较多的选择,从受压软化到受拉软化,模型较多,但也还是不够全面,比如W-W五参数模型就没有。
3.有lattice分析,不过它的建模比较麻烦。
4.有施工阶段分析,这点sap2000也有,但是对于复杂的实体非线性,sap2000还差一些。
5.命令流也挺过瘾,而且似乎还挺简洁的。
6.基本都是键盘操作,有时候可以很快,和早期的algor有点象。
7.分析的filo文件可以保存,挺不错的。
7.有些后处理操作做的不错。


不足
1.虽然键盘操作不错,但是鼠标功能还是差了些,整个界面用的是femsys的界面,太dos了一些。
2.命令流里面没有办法设置复杂一些的操作,比如循环,高级的参数变化,比起其他用python,lisp,apdl的要逊色一些。
3.混凝土有再多一些本构就好了。
4.帮助太过含糊,有许多不明之处,希望能象abaqus。

下面是我学习的第一个例子,按照学习光盘的录像来的,是前处理部分,计算之后可以得到如图的显示效果
不过和他们演示光盘中的结果略微不同。

有限元软件Diana入门例子:
[code]
!analysis of prestressed T beam
FEMGEN D9S
PROPERTY FE-PROG DIANA STRUCT_3D
yes
UTILITY SETUP UNITS LENGTH MILLIMETER
UTILITY SETUP UNITS MASS KILOGRAM
UTILITY SETUP UNITS TIME SECOND
GEOMETRY POINT 0
GEOMETRY SWEEP P1 TRANSLATE 0 100
EYE FRAME
GEOMETRY SWEEP L1 TRANSLATE 0 0 300
DRAWING DISPLAY
EYE FRAME
DRAWING DISPLAY
EYE FRAME
EYE LOCATE
GEOMETRY SWEEP L2 TRANSLATE 0 0 100
GEOMETRY SWEEP L6 TRANSLATE 0 0 -100
UTILITY UNDO
GEOMETRY SWEEP L6 TRANSLATE 0 -100
GEOMETRY SWEEP L7 TRANSLATE 0 100
MESHING DIVISION ELSIZE ALL 50
MESHING DIVISION ELSIZE ALL 50
LABEL GEOMETRY SURFACES S3
MESHING DIVISION ELSIZE ALL 50
EYE FRAME
LABEL GEOMETRY DIVISIONS
MESHING DIVISION LINE L1
MESHING DIVISION LINE L2
MESHING DIVISION LINE L5
EYE FRAME
CONSTRUCT SET OPEN
CONSTRUCT SET OPEN FACE1
CONSTRUCT SET APPEND ALL
CONSTRUCT SET CLOSE
MESHING TYPES ALL QU8 CQ40S
MESHING GENERATE
VIEW MESH CURRENT
VIEW GEOMETRY CURRENT

GEOMETRY SWEEP FACE1 FACE2 40 TRANSLATE 4000
EYE FRAME
GEOMETRY SWEEP FACE2 FACE3 12 TRANSLATE 1200
EYE FRAME
CONSTRUCT SET OPEN BEAM
CONSTRUCT SET APPEND ALL
CONSTRUCT SET CLOSE
!EYE ZOOM .778 .384 .7819999 .378
EYE ZOOM .828 .385 .957 .167
LABEL GEOMETRY LINES ALL
GEOMETRY MOVE L37 TRANSLATE 0 0 80
yes



EYE DIRECTION 0 -1 0
EYE FRAME
CONSTRUCT SET OPEN TMP
CONSTRUCT SET APPEND CURSOR POLYGON .899 .555 .9 .499 .969 .504 .965 .562 .887 .544
CONSTRUCT SET CLOSE
GEOMETRY MOVE TMP TRANSLATE 0 0 -40
yes

EYE FRAME
MESHING TYPES ALL NONE
MESHING TYPES ALL HE20 CHX60
MESHING GENERATE
VIEW MESH CURRENT
VIEW HIDDEN SHADE
VIEW HIDDEN SHADE
VIEW GEOMETRY CURRENT
VIEW HIDDEN FILL
VIEW HIDDEN OFF
EYE FRAME

EYE FRAME
CONSTRUCT SET OPEN
CONSTRUCT SET OPEN TOP
CONSTRUCT SET APPEND CURSOR POLYGON .576E-1 .5470001 .588E-1 .523 .714 .524 .9359999 .517 .938 .542 .711 .554 .42E-1 .542
CONSTRUCT SET CLOSE
VIEW GEOMETRY +TOP RED
EYE FRAME
EYE ZOOM .113 .692 .241 .538
PROPERTY BOUNDARY CONSTRAINT P3 PINNED
PROPERTY BOUNDARY CONSTRAINT P4 PINNED
EYE FRAME
EYE ZOOM .6580001 .531 .786 .315
LABEL GEOMETRY LINES L14
PROPERTY BOUNDARY CONSTRAINT L14 Y Z
LABEL MESH CONSTRNT

EYE FRAME
GEOMETRY POINT 0 50 350
GEOMETRY POINT 2000 50 100
GEOMETRY POINT 4000 50 350
GEOMETRY POINT 5200 50 200
REINFORCE BAR SECTION P31 P32 P33
REINFORCE BAR SECTION P33 P34
REINFORCE BAR BAR1 RE1 RE2

PROPERTY MATERIAL BE1 ELASTIC ISOTROP 35000 0.2
PROPERTY MATERIAL BE1 MASS DENSITY 2400E-9 0
PROPERTY MATERIAL BE1 STATNONL CONCBRIT CRACK CONSTA TENSIO1 ULTIMATE TAUCRI1 NONE 2.5 0.0003 0.2

PROPERTY MATERIAL RP1 ELASTIC REINFORC NOBOND 2.1E5 ""
PROPERTY MATERIAL RP1 STATNONL REINFORC VMISES NONE 500
PROPERTY PHYSICAL PH1 GEOMETRY REINFORC BAR 1000

PROPERTY ATTACH BEAM BE1
PROPERTY ATTACH BAR1 RP1
PROPERTY ATTACH BAR1 PH1
LABEL GEOMETRY MATERIALS


PROPERTY LOADS PRESTRESS BAR1 100
PROPERTY LOADS GRAVITY ALL -9.8 Z
PROPERTY LOADS PRESSURE LO3 2 TOP -0.05 Z

save
yes

UTILITY WRITE DIANA D9S.DAT
yes
ANALYSE D9S
[/code]

前段时间曾经把所有的混凝土本构都学习了一遍,也做了些学习笔记,有空再整理一下。

图1是我自己做的textpad的高亮文件,查错还是挺不错的:)

图2是例子的结果抓图

2006年10月14日星期六

一些岩土工程相关软件

很久很久以前,在写国外结构工程一览的时候同时写的文章,一些岩土工程软件,由于岩土工程不是特别本行,因此没有发过这个,现在就当是记录吧。

一些岩土工程相关软件
(华南理工大学 建筑学院 陈庆军)

_____________________________________________________________________

GEO-SLOPE.OFFICE.V5.0

网址:http://www.geo-slope.com/

GEO-SLOPE Office 是state-of-the-art软件公司的一个软件集合,它用于计算2D的岩土工程和岩土环境的建模。同时这个公司也开发一种SEE3D,一种可以分析三维饱和/不饱和的地下水模型

它包括如下产品:

slope/w 是边坡稳定分析

seep/w是地下水渗透分析

sigma/w是应力和变形分析

quake/w是有限元动力地震分析

ctran/w是污水传输分析(contaminant transport)

GeoStudio.SEEP 3D : 三维饱和/不饱和的地下水渗透分析

GEO-VADOSE/W :二维气流分析(2D evaporative flux analysis)

——————————————————————————————————
Plaxis.7.2.Professional

Web:http://www.plaxis.nl/ie.html

是一个分析岩土工程的有限元程序,它分析岩土变形和稳定性。这个程序可以用复杂的本构关系模型来模拟土壤的非线性和时随效应。同时,由于土壤是一种多相物质,需要特殊的程序来处理土壤中的静水压力和非静水孔压力尽管土壤本身的模型是一个很重要的部分,但是很多岩土工程需要涉及结构的建模以及结构与土壤间的相互作用,pLAXIS就具备有这样的功能来解决岩土工程结构中的各种复杂问题。

_____________________________________________________________________

FLAC 2D & 3D

Web:

flac:快速拉格朗日差分大变形分析计算程序,可计算软土、滑坡等大变形问题,以解决有限单元法不能解决的问题,网格离散与计算分析集成一体,图形界面,计算快速方便。DOS程序。没有找到他的网站。不过可以在这里下载一个
http://www.geosouth.net/geo/software/flac.zip

——————————————————————————————————

Foundation3d.v3.2

Web:http://www.chempute.com/foundation3d.htm

Realese:2001-04-14 Foundation3d.v3.2.WinALL.Cracked-RTP 8.8 Mb

这是一个扩展基础和联合基础的分析/设计软件,它用最少的输入来完成计算各种工业设备(水平传输装置、水平器皿,竖向器皿及塔、管架和其他各类工厂设备)的工作。

单位系统包括:英制,米制和国标

可以使用ACI318和BSI8110建筑规范.可以按照ASCE的推荐值来自动生成交换器、容器、水塔一类的风荷载.只需要输入设备的几何尺寸便可完成设备基础的基本荷载组合,可以根据座块(saddle)之间的距离和土/桩准则来优化设计基础(包括扩展和联合).

在计算容许承载力、稳定性比、基础/承台设计中的桩承载力的时候考虑了浮力的作用。

对非设备基础的荷载类型和数目、荷载组合没有限制可以分析设计方形、矩形、圆形和不规则形状的承台。可以设计方形,矩形,八角形和圆形的墩。在基础/承台的设计中考虑宽梁的剪力和冲切力提供多种形式的基础配筋方案可以在施工图上提供墩中的锚栓布置/生成材料数量.生成基础平、立、剖面施工图和大样图显示钢筋的墩切面

同autocad,microstation,smartsketch等软件配合出施工图

对输入和输出作一个总结(生成文件)

_____________________________________________________________________

MAT3D.v3.3.2.v3.2

Web:http://www.chempute.com/mat3d.htm

这是一个计算多桩情况下的筏板基础的软件,与上个软件同属公司,仔细看看这个公司,产品之多
http://www.chempute.com/main.htm,准备后面作文阐述一番

——————————————————————————————————

CivilTech.Shoring.Suite.Plus.v6.5b

CivilTech.LiquefyPro.v2.3

CIVILTECH.ALL-PILE.v3.1B

CivilTech.SuperLog.v2.8

Web: http://www.civiltech.com/software.html

all-pile:桩的垂直,横断面,群桩,沉降、负摩擦分析

SuperLog Boring,:对钻探资料进行绘图和报告

Shoring:支护墙的设计和分析

Liquefy Pro:地震引起的液化和沉降分析

Epres:土压力分析(主动与被动)

Lpres:超载下的侧压力分析

Upres:地下管道分析

Visual Lab:岩土测试(压实、粒径、固结)

Spectra:对地震谱的图形说明

Heave:对垂直切割的稳定性分析(vertical cut)

_____________________________________________________________________

Surpac

Web: www.infomine.com/index/suppliers/Surpac_Software_International.
html

Surpac.Xplorpac.v4.OL

Surpac.Surplan.v4.0L

这个软件提供了如下功能:地质模型的建立,测量,工程设计,行程安排等工具。


作为现代矿业软件行业内研究和发展的龙头,本软件全球超过85个国家,3000个用
户。

surpac便于应用,具有网络技术,同业界内其他顶尖软件兼容

可分各个模块,便于大小规模厂家应用。

可极大方便矿业工作流程,便于测量人员,矿业工程师与地质学者之间的交流

模块如下:即将推出:NetVision 和 DataVision:这个将在各个不同用户之间建立交流(只

要他们已经连接网络和拥有浏览器,同时datavison会在不同的软件之间传递数据,使得用起来就如在suppac中工作一样)

SURPAC Vision:超强的地质(包括地下部分和深坑)建模软件和设计包,可连接数据库,有很强的建模和cad工具,有三维可视化功能,可输出,多用户授权共享

MineSched:vision的一个部分,可以与ms project excel 及其他3d矿业软件结合,产生3维动画图片,甘特图,网络图和excel表。

XPLORpac:从数据库,3维可视图,图形核心日记,等高线,地图,截面与实体模型中提取数据,输出详细的说明

Quarry:一个适合岩石和矿物的软件,可以预估算,表面建模,体积计算,梯度控制及cad工程设计。

DrillKing:对数据输入及日志管理的一个全过程控制的数据库管理软件

Surplan :在surpac和UK based companies IMCL软件间交换数据的软件。
_____________________________________________________________________

Wasy Ltd. FEFLOW v4.9 SP1

Web: http://www.unine.ch/sig/p67315.gif

对地下水流、污水传输、热传输、及与重力相关水流(如盐水工业)等进行分析的
先进有限元软件

_____________________________________________________________________

WHI.AquiferTest.v3.01

WHI.UnSat.Suite.v2.2.0.1

WHI.Visual.Groundwater.v2.30

Web: http://www.scisoftware.com/html/products.html

aquifertest:管道测试分析

unsat:对大部分不饱和区域的模型编辑

visual.groundwater:对三维模型分析结果的可视分析

这个公司产品太多了,有100多个,看不过来,大家自己去他们的主页那里看吧
_____________________________________________________________________

妙用TC小技巧 文件夹的大小随便看

每年总会向《电脑商情报》投几篇文章,来年的几份报纸(《电脑商情报》、《中国国家地理》、羊城晚报》)订购就有着落了。
下面是一篇小文章:妙用TC小技巧,文件夹的大小随便看
[2006-06-19 13:33:24] [作者:qjchen] [责任编辑:黄莹]
由于有版权问题,因此只提供链接就是了
http://family.chinaok.com/2006-06/20110.htm

2006年10月13日星期五

一篇关于stdlib函数的翻译文章http://qjchen.googlepages.com/STDLIBSHUOMING7.htm

一篇关于stdlib函数的翻译文章,帖子原来发在
http://www.xdcad.net/forum/showthread.php?s=&threadid=477301

表格彩色版的可见这里
http://qjchen.googlepages.com/STDLIBSHUOMING7.htm
上次为了寻找一个找封闭线多义线形心的程序,找到了stdlib:一个由Reini Urban编写的程序库,stdlib是一个标准函数库,包含了许多的内容,包括表,几何体,字符串,文件操作,数学计算,时间,实体等许多方面的内容.它的网站在
http://xarch.tu-graz.ac.at/autocad/stdlib/archive/
这个网站好像最近出了一些问题,暂时不能访问
reini urban的lisp faq还出现在
http://www.faqs.org/faqs/CAD/autolisp-faq/
这个eachy版主转贴过
这个标准库应该是主要是由他一个人完成的,非常佩服他能有这么多精力来完成这项工作,还写了一个非常完整的chm说明书.当然他也疑惑哪些程序应该提供源码的问题.这个程序库应该是在vlisp之前开始撰写的,大部分可以用在r14上
对于比较喜欢r14的人挺有用的.stdlib的应用挺简单的,我一般是把stdlib.lsp加到自动加载,那么以后就可以直接用了.
似乎有有些高手对stdlib不屑一顾,说其会使得速度变慢.说其文件操作引用了doslib等等.
但我觉得作为一个提供了源码,可以了解作者思路,提供学习机会的程序库,已经是特别幸运了,何况里面内置的这么多有用的函数,我们自己编起来也要颇费一番心思,在你需要很快编制出一个程序而不考虑版权的情况下,不妨用用.
下面是自己学习stdlib的一些小体会
首先是对函数的简单翻译,水平有限,错漏不少,有些函数也不知道作者可以拿来作什么用,乱翻了,仅当学习体会以后有时间再写些学习心得,由于其分很多类,只能一类类慢慢的贴了。


文字版本的如下:


函数名称 函数意义 例子
判别类
(consp x) 是否空表
(std-dotted-pair-p x) 是否点对
(std-not-proper-list-p x) 判别最后一个元素是否点对
(std-string-list-p x) 是否字符串表
(std-number-list-p x) 是否数值表
附件搜索类
(first lst) cadr 表的第一个元素,如同cadr
(second lst) 表的第二个元素,如同 caddr
(third lst) 表的第三个元素,如同 cadddr
(fourth lst) 表的第四个元素,如同 (car (cddddr))
(fifth lst) 表的第五个元素,如同 (cadr (cddddr))
(sixth lst) 表的第六个元素,如同 (caddr (cddddr))
(seventh lst) 表的第七个元素,如同 (cadddr (cddddr))
(eighth lst) 表的第八个元素,如同 (car (cddddr (cddddr)))
(ninth lst) 表的第九个元素
(tenth lst) 表的第十个元素
(rest lst) 表中除第一个外的其他元素,如同 cdr
(std-list-length lst) 表中元素长度,接受点对元素accepting dotted pairs
(std-elt lst i) 表中第i个元素的值
(std-position x lst) 元素x在表中的位置
(std-position-if pred lst) 返回第一个满足pred(预定的类型,如字符串,数字,或者是由lambda函数定义的)表达的元素位置,以下称pred为约束条件 "(std-position-if 'numberp '(0 1 2 3))=> 0 (std-position-if 'stringp '(0 ""1"" 2 ""3"")) => 1"
(std-position-if-not pred lst) 返回第一个不满足由pred表达的元素位置
(std-rposition x lst) 返回x在表中最后一次出现的位置
(std-r assoc x alst) 与assoc对应的函数,返回某个指定点对名称所对应的点对 "(std-rassoc ""line"" '((0 . ""line"")(8 . ""0"")(10 0.0 0.0 0.0)) => (0 . ""line"")"
(std-member-if pred lst) 查找表中满足约束条件的第一个元素,并与后面的元素组成一个表,如同visual lisp中的vl-member-if-not "(std-member-if 'numberp '(0 1 2 3)) => (0 1 2 3) (std-member-if 'stringp '(0 ""1"" 2 ""3"")) => (""1"" 2 ""3"")"
(std-member-if-not pred lst) 查找表中不满足约束条件的第一个元素,并与后面的元素组成一个表 "(std-member-if-not 'numberp '(0 1 2 3)) => nil (std-member-if-not 'stringp '(""0"" ""1"" 2 ""3"")) => (2 ""3"")"
(std-count x lst) 返回元素x在表lst中的个数
(std-count-if pred lst) 返回表中满足约束条件pred的元素个数 "(std-count-if 'stringp '(0 ""1"" 2 ""3"")) => 2"
(std-count-if-not pred lst) 与上一个函数相反
子表
(std-firstn n lst) ; 返回表中前n个元素组成的子表,对(std-nthcdr n lst)的补充
(std-nthcdr n lst) ; 返回表中第n个元素之后所有元素组成的子表 (std-firstn 2 '(0 1 2 3)) => (0 1) (std-nthcdr 2 '(0 1 2 3)) => (2 3)
(std-subseq lst start end) 返回表中从start到end-1的一个表 (std-subseq '(0 1 2 3) 1 3) => (1 2) (std-subseq '(0 1 2 3) 0 3) => (0 1 2) (std-subseq '(0 1 2 3) 0 0) => nil (std-subseq '(0 1 2 3) 0 -1) => error (std-subseq '(0 1 2 3) 3 4) => (3)
(std-butlast lst) 返回除了表中最后一个元素的一个表
(std-select ) 根据i选出表中第i个元素,或者根据几个i组成的找出表中的几个元素组成的表。 (std-select '(a b c d) 0) => a (std-select '(a b c d) '(1 0) => (b a) (std-select '(a b c d) '(1 0 4) => error
修改
(std-adjoin x lst) 把一些x假如到list中,假如是重复元素,则不加入,用于构建没有重复元素的表 (std-adjoin 0 '(1 2))=> (0 1 2) (std-adjoin 1 '(1 2)) => (1 2) (std-adjoin 1 nil) => (1) (std-adjoin nil nil) => (nil)
非破坏性的操作
(std-setnth new i lst) 用于修改第i个元素为新值new (std-setnth 'new 2 '(0 1 2)) => (0 1 new)
(std-delpos i lst) 删除表中第i个元素,返回精简的表 (std-delpos 1 '(1 2)) => (1)
(std-remove x lst) 删除表中元素值为x的所有元素,返回精简的表 (std-remove 0 '(0 1 2))=> (1 2) (std-remove -1 '(0 1 2)) => (0 1 2) (std-remove 0 '(0 1 0 2))=> (1 2)
(std-remove-if pred lst) 除表中满足某种约束条件pred的元素,返回表 (std-remove-if 'numberp '(0 1 2)) => nil
(std-remove-if-not pred lst) 与上一个函数相反,保留
(std-remove-duplicateslst) 删除重复元素,排序不破坏。
(std-split-list n lst) 按照个数n将表分成许多子表 (std-split-list 3 '(0 1 2 3 4 5 6 8 9)) => ((0 1 2)(3 4 5)(6 7 8)(9))
(std-flatten lst) tree将表变为一维表,没有子表形式 (std-flatten '((0 1 2)(3 4 (5))(6 7 8)(9)) => (0 1 2 3 4 5 6 8 9)
(std-rotate-left lst) 把表的第一个元素移到最后一个 (std-rotate-left '(0 1 2 3 4)) => (1 2 3 4 0)
(std-rotate-right lst) 把表的最后一个元素移到第一个
破坏性的建表形式,push(推)或者pop(取)
(std-push x 'lst) 将一个元素推到表(堆栈)中,有破坏性 (std-push 0 '(1 2 3)) => (0 1 2 3) (setq stack '(1 2 3)) (std-push 0 'stack) => (0 1 2 3)
(std-pop 'lst) 将一个元素从表(堆栈)中取出,有破坏性 (std-pop '(1 2 3)) => 1 (setq stack '(1 2 3)) (std-pop 'stack) => 1
(std-pushnew x 'lst) 将新值推到表(堆栈)中,有点类似std-adjoin,有破坏性 (std-pushnew 0 '(0 1 2 3)) => (0 1 2 3) (setq stack '(1 2 3)) (std-push 0 'stack)=> (0 1 2 3)
(std-pushmax x 'lst nmax) 将新值推到表(堆栈)中,但保持表的最大长度为nmax,有破坏性 (std-pushmax 0 '(1 2 3 4) 4) => (0 1 2 3) (setq stack '(1 2 3)) (std-push 0 'stack 4) => (0 1 2 3) !stack=> (0 1 2 3) (std-push 1 'stack 4) => (1 0 1 2)
"mapping, iteration 映射,反复"
(std-mapatom func tree) 将表中所有的元素按照func定义的函数进行变化,表中所有元素的树状结构不会改变 (std-mapatom '1+ '(0 1 (2 (3))))=> (1 2 (3 (4))) (std-mapatom (function (lambda (x) (cons 0 x))) '(0 1 (2 (3))))=> ((0 . 0)(0 . 1) ((0 . 2) ((0 . 3))))
(std-every pred lst) 对表中元素进行约束条件(pred)的测试,都对了返回t,否则nil (std-every 'std-pointp points)
(std-every-n pred lists) 相比every-n,有更多参量
(std-some pred lst) 对表中某些元素进行约束条件(pred)的测试,只要有对了就返回t,否则nil
(std-some-n pred lists) (std-some pred lst) 的多参量判别
集合操作(无序的多集合)
(std-union set1 set2) 集合的并操作,合并两个集合,把第二个集合中的元素加到第一个,不是很稳定的函数,比(std-ordered-union set1 set2)稍快
(std-ordered-union set1 set2) 比较稳定的版本,集合并操作,保持第一个集合的顺序,第二个集合中的不同元素加入到集合一的最后 (std-ordered-union '(1 5 3 4) '(1 2 3 3)) => (1 5 3 4 2)
(std-intersection set1 set2) 集合的交操作 (std-intersection '(2 1 5 3 3 4 2) '(2 1 2 3 3))=> (2 1 3 3 2)
(std-set-difference set subset) 集合1中不在集合2中的元素 (std-set-difference '(0 1 2 3 4 5) '(2 0 6 7)) => (1 3 4 5)
(std-set-exclusive-or set1 set2) 集合的余操作,不同时属于集合1或集合2的元素 (std-set-exclusive-or '(0 1 2) '(2 3 4)) => (0 1 3 4)
(std-subsetp subset set) 集合1是否集合2的子集 (std-subsetp '(1 2) '(0 2 1 2)) => t; (std-subsetp '(3 1 2) '(0 2 1 2)) => nil
(std-set-equal-p lst1 lst2) 集合1、2是否完全相等 (std-set-equal-p '(0 1 2) '(1 2 0)) => t (std-set-equal-p '(0 1 2) '(1 1 2 0))=> nil
表的创建
(std-make-listn def) 建立一个包含n个def的表 (std-make-list 3 nil)=> (nil nil nil); (std-make-list 3 0.0)=> (0.0 0.0 0.0)
(std-int-list n) 创建一个从0~n-1整数序列的表 (std-int-list 3)=> (0 1 2)
(std-iseq start end) 创建一个从start到end的整数表 (std-iseq 1 5)=> (1 2 3 4 5); (std-iseq 5 5)=> (5)
(std-rseq start end n) real sequence of n nums
(std-nxtcyc i n incr-func) 找出第i个元素在整数n循环(就是0,1,2,3 n-1)中,下一个应该出现的数,一个比较奇怪的概念,据作者说用在多义线的子实体方面比较有用, (std-nxtcyc 0 3 '1+)=> 1 (std-nxtcyc 1 3 '1+)=> 2 (std-nxtcyc 2 3 '1+)=> 0 (std-nxtcyc 3 3 '1+)=> 1
(std-copy-treelst) 把一个表拷贝到一个备份中,比较奇怪,作者说这个几乎在autolisp中不用,除了说想对表排序又不想破坏其结构。
排序和整合
(std-sortlst less-pred) 排序函数 "(std-stable-sort '(2 0 1 2 3 4 0) '<) => (0 0 1 2 2 3 4) (std-fast-sort '(""2"" ""1"" ""3"" ""4"" ""0"") '<) => (""0"" ""1"" ""2"" ""3"" ""4"") (std-sort pointlist '(lambda (x y) (< (car x) (car y))))"
(std-stable-sortlst less-pred) " 类似,不删除多余元素,保留次序"
(std-fast-sortlst less-pred) 删除多余元素
(std-mergelst1 lst2 less-pred) 对两个表按某种排序法进行合并 (std-merge '(0 2 3) '(1 4 5) '<)=> (0 1 2 3 4 5)
随机数
(std-randomize lst) 对原表进行随机打乱 (std-randomize '(0 1 2 3 4))
(std-random-elt lst) 随机取出表中的某个元素


字符串
函数名称 函数意义 例子
谓词,判断Predicates
(STRINGP expr) 表达式是否字符
(STD-STRING-NOT-EMPTY-P expr) 是否非空字符串
(STD-ISCHAR char) 是否由[a~z]或[A~Z]组成的字符串
(STD-ISDIGIT char) 是否由属于[0~9]的数字组成的字符串
(STD-ISCONTROL char) 是否属于ascii码小于32的键组成的字符串
(STD-ISUPPER char) 是否大写字母
(STD-ISLOWER char) 是否小写字母
比较Comparison
(STD-STRING= s1 s2) 两个字符串是否相等
(STD-STRING/= s1 s2) 两个字符串是否不相等
(STD-STRING< s1 s2) s1字符串是否小于s2字符串,按asc码逐个比较,下同
(STD-STRING<= s1 s2) s1字符串是否小于等于s2字符串,按asc码逐个比较,下同
(STD-STRING> s1 s2) s1字符串是否大于s2字符串,按asc码逐个比较,下同
(STD-STRING>= s1 s2) s1字符串是否大于等于s2字符串,按asc码逐个比较,下同
(STD-STRING-EQUAL s1 s2) 两个字符串是否相等,equal和=的区别在于是否大小写敏感
(STD-STRING-NOT-EQUAL s1 s2) 两个字符串是否不相等
(STD-STRING-LESSP s1 s2) s1字符串是否小于s2字符串,按asc码逐个比较,下同
(STD-STRING-NOT-LESSP s1 s2) s1字符串是否小于等于s2字符串,按asc码逐个比较,下同
(STD-STRING-GREATERP s1 s2) s1字符串是否大于s2字符串,按asc码逐个比较,下同
(STD-STRING-NOT-GREATERP s1 s2) s1字符串是否大于等于s2字符串,按asc码逐个比较,下同
附件,搜索,匹配
(STD-STRING-ELT str i) 返回第几个字符,以0为起点 "(std-string-elt ""12"" 0) => 64"
(STD-FIRSTCHAR str) 第一个字符
(STD-LASTCHAR str) 最后一个字符
(STD-LASTCHARS n str) 最后n个字符
(STD-STR-1 str) 去掉最后一个字符的字符串
(STD-STR-N n str) 去掉最后n个字符的字符串
(STD-STRPOS substr str) 子串str在母字符串substr中的起点位置,以1为基准点 "(std-strpos ""0123"" ""12"") => 2"
(STD-STRIPOS substr str ) 与上同,但大小写不敏感 "(std-stripos ""Test"" ""t"") => 1"
(STD-STRING-POSITION ichar str ) 这个没有说明
(STD-STRCMP substr str ) 检查子串str是否母串的开头几个字符组成的
(STD-STRICMP substr str ) 与上同,但大小写不敏感 "(std-stricmp ""Test"" ""TEST"") => T"
(STD-STRING-MISMATCH str1 str2) "类似vl中的vl-string-mismatch,返回两个字符串中从指定位置开始,最长的共同前缀的长度 " "(std-string-mismatch ""STD-FUN"" ""STD-VAR"") => 3"
(STD-WCIMATCH str match) 和Wcmatch类似,不过大小写不敏感 "(std-wcimatch ""testname"" ""Test*"") => T"
(STD-STRCOUNT substr str ) 子串在某字符串中出现的个数 "(std-strcount ""1Test1"" ""1"") => 2"
(STD-STRMEMBER match strlst) 和member类似,不过可以使用适配符#,*之类,大小写敏感 "(std-strmember ""Test*"" '(""0"" ""Testname"" ""Testlayer""))=>(""Testname"" ""Testlayer"")"
(STD-STRIMEMBER match strlst) 见上一个函数,大小写不敏感 "(std-strmember ""Test*"" '(""0"" ""Testname"" ""Testlayer""))=> (""Testname"" ""Testlayer"")"
(std-strlist-match ) 返回所有符合要求的字符串,使用WCMATCH适配符模式 "(std-strlist-match '(""Testname"" ""0"" ""Testlayer"") ""Test*"")=> (""Testname"" ""Testlayer"")"
转换类型
(STD-STRCASE str) 类似strcase,转大写或小写,不过更高级的是可以转换其他8位的非英语字母
(STD-STRING-UPCASE 'str) 类似上一函数,专门转大写
(STD-STRING-DOWNCASE 'str) 类似上一函数,专门转小写
(STD-STRING-CAPITALIZE 'str) 类似上一函数,所有单词第一字母变大写,其他字母变小写
(STD-CPTRANS str from-cp to-cp) 代码页的转换,这个函数不是很懂
(STD-SYMBOL-NAME sym) 返回包含某符号名的字符串,类似vlisp中的vl-symbol-name "(std-symbol-name 'my-var) => ""MY-VAR"""
(STD-TOSTR sym) 将多种表达式转化为字符串 "(std-tostr '(0 1 2)) => ""(0 1 2)"""
替换
(STD-STRING-SUBST new old str) 代替字符串str中的old字母为new字母,只代替第一个找到的 "(std-string-subst ""new"" ""old"" ""old-test-old"")=> ""new-test-old"""
(STD-STRCHG str old new) 类似上一函数,代替所有找到的 "(std-strchg ""test"" ""s"" ""S"") => ""teSt"""
(STD-STRING-TRANSLATE old new str) 类似VL函数中的vl-string-translate,在字符串中替换字符 "(std-string-translate ""abcdefgh"" ""ABCDEFGH"" ""my house is yellow"")=> ""my HousE is yEllow"
(STD-STRING-WC-REPLACE str pattern new options) wildcard代替 "(std-string-wc-replace ""my House is yellow"" ""[aeiou]""'(std-strcase $&) ""c4"")=> ""my HOUsE Is yellow""
"
(STD-ENTAB str n) 把一堆空格改为tab表示 "(std-entab "" test"" 8) => ""\ttest"""
(STD-ENTAB8 str) 类似上一个函数,tab的定义为第八个字符 "(std-entab "" test"" 8) => ""\ttest"""
(STD-DETAB str n) 把tab返回空格 "(std-detab ""\ttest"" 8) => "" test"""
(STD-DETAB8 str) 类似上一个函数,tab的定义为第八个字符 "(std-detab ""\ttest"" 8) => "" test"""
处理特殊记号
(STD-STRTOK str delims) 把字符串str按照某些特殊符号组合delims分割成表,delim可以是空格,逗号等的组合,不分先后,不留空元素 "(std-strtok "" ,1, 2"" "", "") => (""1"" ""2"")"
(STD-STRSPLIT str delim) 类似上个函数,保留空元素 "(std-strsplit "",1"" "","") => ("""" ""1"")"
补充
(STD-STRJOIN strlst delim) 将strlst字符串表用连接符delim连成一个字符串 "(std-strjoin (std-int-list 4) "","") => ""0,1,2,3"""
有用的函数
(STD-STRING->LIST str) 把一字符串转为ascii码组成的表,vl-string->list "(std-string->list ""012"") => (48 49 50)"
(STD-LIST->STRING intlst) 与上相反,是vl中的vl-list->string "(std-list->string '(49 50)) => ""12"""
(STD-LIST->WSTRING intlst) 与上类似,不过可以处理比256大的ascii码 "(std-list->wstring '(49 50 9600)) => ""12€"""
缩写
(STD-STRING->STRLIST str delims) 把字符串str按照某些特殊符号组合delims分割成表,delim可以是空格,逗号等的组合,不分先后 "(std-string->strlist "" , 1, 2"" "", "")=> (""1"" ""2"")"
(STD-STRLIST->STRING strlst delim) 同上相反,把一个由字符串组成的表逐一加上delims符号组成新的字符串 "(std-strlist->string '("""" ""1"" ""2"") "","")"
(STD-CSSTRING->STRLIST str) STD-STRING->STRLIST函数的特例,专门拿来处理逗号和空格 "(std-csstring->strlist "" , 1, 2"")) => (""1"" ""2"")"
(STD-STRLIST->CSSTRING strlst) STD-STRLIST->STRING的特例,专门拿来加上逗号 "(std-strlist->csstring '("""" ""1"" ""2"")) => "",1,2"""
(STD-DCLSTRING->STRLIST str) STD-STRING->STRLIST函数的特例,专门拿来处理空格 "std-dclstring->strlist (get_tile ""mlist""))(mapcar 'atoi (std-dclstring->strlist ""1 2 3"")) => (1 2 3)"
(STD-STRLIST->DCLSTRING strlst) STD-STRLIST->STRING的特例,专门拿来加上空格 "(std-strlist->dclstring (mapcar 'itoa '(1 2))) ; => ""1 2"""
格式化
(STD-TRIM str) 去掉字符串前后的空格,以及\t\n之类的特殊符号 "(std-trim ""\n\t test "") => ""test"""
(STD-STRING-TRIM charbag str) 类似上一个函数,专门去掉\t\n之类的符号 "(std-string-trim ""\n"" ""\n\t test\t "") => ""\t test\t """
(STD-STRING-RIGHT-TRIM charbag str) 类似上一个函数,专门去掉字符串后部\t\n之类的符号 "(std-string-right-trim ""\t "" ""\n\t test\t "") => ""\n\t test"""
(STD-STRING-LEFT-TRIM charbag str) 类似上一个函数,专门去掉字符串前部\t\n之类的符号 "(std-string-left-trim ""\n"" ""\n\t test\t "") => ""\t test\t """
(STD-STRING-REMOVE-COMMENTS 'str) 去掉字符串中由;开始引导的注释部分
(STD-STRING-LEFT-PAD-CHAR str len fill-char) 将字符串进行左取齐,切掉或者补齐其他部分 "(std-string-left-pad-char ""0001"" 3 "" "") => ""000"""
(STD-STRING-RIGHT-PAD-CHAR str len fill-char) 将字符串进行右取齐,切掉或者补齐其他部分 "(std-string-right-pad-char (rtos 1.0) 6 ""-"") => ""---1.0"""
(STD-LPAD s len) 将字符串补齐到规定的长度,左对齐 "(std-lpad (rtos 1.0) 6) => ""1.0 """
(STD-RPAD s len) 将字符串补齐到规定的长度,右对齐 "(std-rpad (rtos 1.0) 6) => "" 1.0"""
(STD-STRCENTER str len) 将字符str填充为长度len的字符,补充前后空格,字符串置中, "(std-strcenter ""test"" 10)=>"" test "" (std-strcenter ""test"" 10) => "" test """
杂类
(STD-RTOS num) 按最大精度转换为字符串 "(std-rtos 2.01) => ""2.01"""
(STD-MAKE-STRING n def) 创建n个def组成的字符串 "(std-make-string 5 ""x"") => ""xxxxx"""


点,线和几何关系
函数名称 函数意义 例子
(X-OF pt) (x y [z])的x值
(Y-OF pt) (x y [z])的y值
(Z-OF pt) (x y [z])的z值
(XY-OF pt) (x y [z])的(x y)值
"(STD-X-MIN,STD-Y-MIN,STD-Z-MIN pts) " " 点集中的x,y,z下限值"
"(STD-X-MAX,STD-Y-MAX,STD-Z-MAX pts) " " 点集中的x,y,z上限值"
"(STD-XY-MIN, STD-XY-MAX pts) " 包住点集的矩形边界中的左下角点,右上角点
"(STD-XYZ-MIN, STD-XYZ-MAX pts) " 包住三维点集长方体边界中的最小和最大点
(STD-PT+ p1 p2) 矢量相加
(STD-PT- p1 p2) 矢量相减
(STD-MIDPT pt1 pt2) 两点的中点
(STD-HALFPT pt) 返回点和原点的中点
(STD-NEW-Z pt num) 把点pt的z坐标改到数num
(STD-ADD-Z pt num) 把点pt的z坐标增大数num
(STD-RANDOM-PT) " [0,0,0] [1,1,1]范围的的随机点"
点的谓词Point Predicates:
(STD-POINTP pt) 是否2d或3d点
(STD-2DPOINTP pt) 是否2d点
(STD-3DPOINTP pt) 是否3d点
(STD-SEG-P obj) 是否多义线(复线)中的一段
Geometry:普通几何体
(STD-DISTANCE-2D p1 p2) 在p1和p2在当前wcs上的投影距离
(STD-TRANS01 pt) 把点pt转换到UCS中
(STD-TRANS10 pt) 把点pt转换到wCS中
(STD-MAPTRANS01 pts) 把点集pts转换到UCS中
(STD-MAPTRANS10 pts) 把点集pts转换到WCS中
(STD-FIXANG angle) 将一个由弧度表示的角度等效到0~2pi的范围内
Advanced Geometry:高级几何体
(STD-CENTROID-2D pts) 2维封闭多义线组成的图形的形心,要求输入顶点集坐标
(STD-VECTOR-MEAN-3D pts) 3维点与原点形成的矢量集的平均矢量
(STD-VECTOR-MEAN pts) n维点与原点形成的矢量集的平均矢量
(STD-CCW p0 p1 p2) p0 p1 p2的方向是否顺时钟?
(STD-PTONSEG-P p1 p2 testpt) testpt是否位于p1和P2形成的线段上,包括在端点
(STD-INSIDE-POLY-P pt pts) 点pt是否位于pts形成的多义线区内,UCS
"多义线的段,及凸度Segments, Bulges:"
(STD-MAKE-SEG p1 p2 bulge) " 由p1,p2创建pline中的一段线,bulge可以是空的"
(STD-SEG-P1 seg) 段(指的是多义线中的一段,下同)的起点
(STD-SEG-P2 seg) 段的第二点
(STD-SEG-BULGE seg) 段的凸度bulge
(STD-SEG-BULGE-NUM seg) 段的凸度bulge,保证是一个数值,用0代替nil
(STD-SEG-ANGLE seg) 等同于对段的端点p1-p2进行angle操作得到的结果
(STD-SEG-LENGTH seg) 返回带有凸段弧线的长度
(STD-SEG-PTS-DIST seg) 段两个端点p1-p2的直线距离
(STD-SEG-STRAIGHT-P seg) bulge是否为nil
(STD-SEG-P1-UC seg) 当前UCS中的段的起点p1坐标
(STD-SEG-P2-UC seg) 当前UCS中的段的端点p2坐标
(STD-SEG-ANGLE-UC seg) 当前UCS中的段的p1和p2形成的角度
(STD-SEG->CIR seg) 对一个凸段返回一个相关的圆,结果是一个列表(中点,半径)
(STD-ARC->SEG cir ang1 ang2) 把由圆及两个起始角确定的弧转为段seg
(STD-ARC->BUL p1 p2 cir ccw) " 根据端点,圆,和ccw(符号,决定顺逆时针)来确定凸度"
(STD-BUL->ANG seg) 根据段的起点终点和凸度求弧段圆心角
(STD-ARC->ANG chord rad) 给定弦长和半径求弧长
(STD-ARCLEN seg) 计算段的弧长
(STD-PTS->SEGS pts) 点集到段集,全是直线,(p1 p2 p3) ((p1 p2)(p2 p3))
(STD-SEGS->PTS segs) 段集变为点集,忽略凸度,((p1 p2 0.5)(p2 p3)) (p1 p2 p3)
(STD-POLYEDGE i poly len) 多义线的第i段
(STD-SEGS-CLOSED-P segs) 是否闭合的多义线


数学函数
函数名称 函数意义 例子
内置定义
*INFINITY* 1.7e308
*NUM-TOL* "1e-6, 比较的精度"
*EPSILON* "1e-12, 用户自定义的一个极小值"
*MACHINE-EPSILON* "0.000000000000000222, 足够小的数"
*MAX-INT* 最大的整数
*MAX-LONGINT* "2147483647,带正负号的最大长整数(32位)"
*MAX-SHORTINT* "32767, 带正负号的最大短整数(16位)"
*MAX-REAL* "1.7e308 , 双精度最大浮点数"
*PI2* " (* PI 2), PI doubled, 360°"
*PI/2* " (/ PI 2), 90°"
*PI/4* " (/ PI 4), 45°"
逻辑关系
AutoLISP内置函数
(LOGAND int int...) 返回一个整数表中的各数按位逻辑与 (AND) 的结果
(LOGIOR int int...) 返回一个整数表中的各数按位逻辑或 (OR) 的结果
(BOOLE func int int...) 用作一个通用的按位逻辑运算函数
(LSH int num-bits) 返回某整数作指定次逻辑移位后的结果
StdLib函数:
(STD-LOGXOR int int) 同(boole 6 int1 int2)相同,对两个数逐位取or
(STD-LOGNOT int) 对一个数逐位取1的补数
(STD-BITSETP val flag) (std-bitsetp 128 1) => nil
(STD-SETBIT val flag) (std-setbit 128 1) => 129
(STD-BITDEL val flag) (std-bitdel 128 129) => 1
(STD-BITLIST int) list of bitvalues
(STD-BITTOGGLE val flag) toggles bits in flag
基数转换
(STD-NUM->HEX int) 十进制到十六进制 "(std-num->hex 10) => ""A"""
(STD-HEX->NUM str) 十六进制到十进制 "(std-num->hex ""2a"") => 42"
(STD-NUM->BINint) 十进制到二进制 "(std-num->bin ""2"") => (1 0)"
(STD-BIN->NUM intlst) 二进制到十进制 (std-bin->bin '(0 1 1)) => 3
(STD-NUM->OCTint) 十进制到八进制 "(std-num->oct 151) => ""227"""
(STD-OCT->NUM str) 八进制到十进制 "(std-oct->num ""227"") => 151"
函数
AutoLISP内置函数
(EXP num) e的num次方
(EXPT num x) num的x次方
(LOG num) 自然对数
(SQRT num) 平方根
StdLib函数:
(STD-SQR num) 平方
(STD-SQRT num) 平方根,据说比系统的sqrt好的地方是整数平方根就是整数
(STD-EXPT num x) 数num的x次方
(STD-ROUND num) 四舍五入到最接近的整数
(STD-FRACTION num) 只取出分数部分 (std-fraction -12.03) => 0.03
(STD-FLOOR num) 向下取整 (std-floor 1.1) => 1 (std-floor -1.1) => -2
(STD-CEILING num) 向上取整 (std-ceiling 1.1) => 2 (std-ceiling -1.1) => -1
(STD-LOG2 int) " log2, log 的基数是2"
(STD-LOG10 num) " log10, log 的基数是10"
(STD-ISQRT num) 返回数值平方根的整数部分 (std-isqrt 3) => 1 (std-isqrt 4) => 2
(STD-GCD intlst) 返回数值表的最大公约数 (std-gcd '(2 4 8)) => 2
(STD-LCM intlst) 返回数值表的最小公倍数 (std-lcm '(2 3 4))=> 6 (* 2 3)
统计相关
(STD-MEAN numlst) 数值表的平均值 (std-mean '(0 0 2 4 12)) => 3.6
(STD-MEDIAN numlst) 比数值表中一半数大,比另一半数小的一个数 (std-median '(0 0 4 12) => 2.0
(STD-STANDARD-DEVIATION numlst) 说明不清楚的一个函数,返回一个你想要的数
质数,只存在质数模块
(STD-PRIMEP n) n是否质数 (std-primep 10000005) => nil
(STD-PRIME-FACTORIZATION n) n的质数分解 (std-prime-factorization 1118) => (43 13 2)
(STD-PRIMES n) 小于n的所有质数的列表 (std-primes 21)=> (19 17 13 11 7 5 3 2)
随机数
(STD-RANDOM num) 一个小于num的随机数
只存在随机数模块中
(STD-MAKE-RANDOM-STATE num) 关于随机状态的一个函数
(STD-RANDOM-STATE-P num) 关于随机状态的一个函数
三角函数
AutoLISP内置函数和常数
PI PI 具有最大的精度
(SIN radians) 正弦
(COS radians) 余弦cosine
(ATAN radians) 余切
StdLib函数:
(STD-DTR degree) 角度转弧度
(STD-RTD radians) 弧度转角度
(STD-TAN radians) tan x = sin x/cos x正切
(STD-ACOS radians) arc cosine反余弦
(STD-ASIN radians) arc sine反正弦
(STD-SEC radians) secant正割
(STD-CSC radians) cosecant余割
(STD-ASEC real) arc secant反正割
(STD-ACSC real) arc cosecant反余割
(STD-ACOT real) arc cotangent反余切
(STD-SINH radians) hyperbolic sine双曲正弦
(STD-COSH radians) hyperbolic cosine双曲余弦
(STD-TANH radians) hyperbolic tangent双曲正切
(STD-SECH radians) hyperbolic secant双曲正割
(STD-CSCH radians) hyperbolic cosecant双曲余割
(STD-ARSINH real) hyperbolic area sine
(STD-ARCOSH real) hyperbolic area cosine
(STD-ARTANH real) hyperbolic area tangent
(STD-SIGNUM num) " 返回一个数是正数负数或者是0-1, 0 or 1"
"排列组合函数,存在外部函数模块COMBINATIONS:"
(PERMUTATE lst) 返回一个表的各种排列(不在lisp中)
(COMBINATIONS lst m) 表取出m个元素的组合n!/m!(n-m)!
(PERMUTATIONS lst m) 表取出m个元素的排列
(FACTORIAL n) n的阶乘!
(COMBINATIONS-COUNT n m) n!/m!(n-m)!
(PERMUTATIONS-COUNT n m) n!/(n-m)!
(NTH-PERMUTATION i lst) 表的第i种排列排列
(NTH-PERMUTATIONS i lst m) 表取出m个元素的第i种排列
(NTH-COMBINATIONS i lst m) 表取出m个元素的第i种组合


文件操作函数
函数名称 函数意义 例子
文件名
(STD-MAKE-PATHNAME list) 将一个表内的内容组成文件目录和文件名 "(setq a (list ""c:"" ""123.txt""))=> (""c:"" ""123.txt"") (STD-MAKE-PATHNAME a)=> ""c:\\123.txt"""
(STD-FPSLASH fspec) " 作如下事情 ""d:/acad"" -> ""d:\\acad\\"""
(STD-FILENAME-SPLIT fspec) " 作如下事情,变表 ""d:\acad\lisp.doc"" -> '(""d:\acad\"" ""lisp"" "".doc"")"
(STD-FILENAME-DIRECTORY fname) " 只取出路径," "(std-filename-directory ""d:/acad/test"") => ""d:\\acad\\"""
(STD-FILENAME-BASE fspec) 只取出文件名 "(std-filename-base ""d:/acad/test.lsp"") => ""test"""
(STD-FILENAME-EXTENSION fspec) 只取出文件后缀名 "(std-filename-extension ""d:/acad/test.lsp"") => "".lsp"""
(STD-FILENAME fspec) 同时取出文件名和后缀名
(STD-FILEBASE fspec) " 目录和文件名,没有后缀"
(STD-FORCE-PATH path fname) " 用新目录代替原目录,文件名不变" "(std-force-path ""d:/acad"" ""e:\\lisp\test.lsp"") => ""d:\\acad\\test.lsp"""
(STD-DEF-EXTENSION fname defext) " 将文件和文件名联合起来,假如原来已经有文件名,则不作修改"
(STD-FORCE-EXTENSION fname ext) " 与上个函数类似,但强制改后缀"
(STD-LONGFNAMEP fname) 是否长文件名?
(STD-FILENAME-UPCASE fname) 对非长文件名返回大写的目录和文件名
Directories目录,需要外部函数,比如doslib或者vital lisp/visual lisp环境,2k+的acad应该可以用
判断
(STD-PROBE-FILE fname) " 判断文件是否存在,返回nil或者文件名"
(STD-FILE-EXIST-P fname) " 判断文件是否存在,返回nil或者T"
(STD-FILE-READABLE-P fname) " 判断文件是否可读,T or nil"
(STD-FILE-WRITABLE-P fname) " 判断文件是否可写,T or nil"
(STD-FILE-DIRECTORY-P fname) " 判断是否合法目录,T or nil"
(STD-DOS-FILENAME fname) 把长文件名变为dos 8.3 的短文件名
(STD-SAME-FILES-P fname1 fname2) " 两个文件是否相同,T or nil"
杂项
(STD-FILENAME-MKTEMP prefix) 创建一个与现有临时文件不同的临时文件 "(std-filename-mktemp ""/mydir/$t"") => ""/mydir/$T000.AC$"
文件属性
(STD-FILE-SYSTIME fname) 用cdate方式给出文件的创建或最后更新时间 "(std-file-systime ""/acad/"") => 19971230.202520"
(STD-FILE-MODTIME fname) "与上类似,给出修改时间,cdate格式,用了vl函数"
(STD-FILE-SIZE fname) 文件大小
(STD-FILE-ATTRIB fname) " 文件属性标记,1: 只读,2: 隐藏,4: 系统,8: archive,2048:压缩"
(STD-FILE-NEWER-P target deps) 对比第一个文件创建时间是否早于第二个文件
全局
(STD-DIRECTORY-FILES fspec) 用一个表返回某目录下所有的文件及目录 "(STD-DIRECTORY-FILES ""k:\\book\\"")"
(STD-GLOB-FILES fspec) 列出目录下符合某种适配符格式的所有文件 "(std-glob-files ""C:/ACAD/SUPPORT/*.LSP"")"
(STD-GLOB-DIRS fspec) " 与上类似,列出的是文件夹" "(std-glob-dirs ""*L*"")"
搜索
(STD-FINDFILE fspec) " 搜索文件搜索目录下的某个文件,先找 *MODULE-PATH* 下的文件, 再找acad的默认路径" "(std-findfile (std-def-extension ""acad"" ""lsp""))"
(STD-FINDFILE-PATHS fspec path-list) 搜索在path-list目录集下面的某个文件
(STD-FINDFILE-EXTS fspec ext-list path-list) " 与上类似,增加后缀集"
(STD-ACAD-LIBRARY-PATHS) (std-acad-library-paths)给出cad的preference中指定的搜索路径
系统System
对文本文件直接支持,对二进制文件需Vital Lisp/Visual Lisp or ADS/ARX支持
(STD-FOPEN fname ch) 代替(open fname ch)
(STD-FCLOSE f) 代替(close f)
(STD-FCLOSEALL) 用于在出错的时候关闭所有打开过而未关闭的程序
(STD-CURRENT-PATH) " 给出当前的目录,比如""C:/ACAD/"""
(STD-CURRENT-DRIVE) "给出当前的目录所在的盘符 ""C:"""
(STD-TRUENAME fname) " 给出一个绝对的,唯一的带绝对路径完整文件名," "(std-truename ""acad/../acad/test.lsp"") => ""C:\\acad\\test.lsp"""
(STD-MKDIR fname) 创建一个目录
(STD-RMDIR fname) 移除一个目录
需外部支持函数
(STD-FILE-COPY from to) 拷贝文件 "(std-file-copy ""/acad/test.lsp"" ""/acad/test.bak"")"
(STD-FILE-APPEND dest source) 把source的内容加到dest后面去. "(std-file-append ""mymenu.mnu"" ""menuadd.txt"")"
(STD-FILE-DELETE fname) 删除一个文件
(STD-FILE-RENAME old new) 重命名文件
(STD-FILE-BACKUP fspec) 另存一份拷贝到.BAK文件中去
(STD-GET-DRIVE-LIST) " 用表格式给出所有逻辑盘符: (""A"" ""C"" ""D"" ""E"")"
处理文本文件: (与系统无关)
(STD-FT-COPY fn1 fn2) 拷贝fn1到fn2
(STD-FT-APPEND fn1 fn2) 追加fn2到fn1后面
(STD-FT-BACKUP fspec) 用一个.bak的文件来备份fspec指定的文件
(STD-FT-NTH-LINES fname line) " 返回文本文件第line行的内容(std-ft-nth-line (std-findfile ""acad.pgp"") 1)"
(STD-FT-LINES fname from to) 返回文本文件第from行到to行的内容
(STD-FT-INSERT fname strlst num) 将字符串strlst插入到文本文件中的第num行
(STD-READ-FILE-STRINGS fname) " 将文件fname中每一行的内容读出,输出到一个表,忽略"
(STD-READ-FILE-LIST fname) " 读出一个lisp文件,每一句用一个子表来表示"
"二进制文件(这个不是很懂,大概是高级应用吧)Binary File IO:" (std-require-external 'BINIO)
下面这些功能不能用普通的lisp函数处理.
(BINIO-FOPEN fname mode) " 用""r"" ""w"" ""rw"" ""a""模式打开"
(BINIO-FCLOSE f) 关闭由fopen打开的文件
(BINIO-FCLOSEALL) 在错误时关闭所有文件
(BINIO-FSEEK f pos [start-from]) 移动指针到给定位置
(BINIO-FTELL f) 返回指针位置
(BINIO-REWIND f) 把指针移到0
所有fput函数接受单个或者表类型
(BINIO-FPUTC f int|list-of-ints) 写一个字节或者一个字节表到一个stream(文件?)中
(BINIO-FPUTINT f int|list-of-ints) "与上类似,写入的是整数"
(BINIO-FPUTLONG f long|list-of-longs) "与上类似,写入长整数"
(BINIO-FPUTREAL f real|list-of-reals) "与上类似,写入的是IEEE的4字节长浮点数"
(BINIO-FPUTS f str|list-of-strs) "与上类似,写入的是ASCIIZ的字符串,不理\r和\n是结束"
(BINIO-FPUTSTRING f str|list-of-strs) "与上一个函数相似,但对\r\n进行处理"
(BINIO-FGETC f) " 类似read-char读出一个字节,但是也可以处理0x0"
(BINIO-FGETINT f) 读出带符号的短整数
(BINIO-FGETREAL f) " 读出IEEE的四字节数,实数"
(BINIO-FGETLONG f) 读出带符号的长整数
(BINIO-FGETS f) " 读出ASCIIZ string字符串,不理会\r和\n"
(BINIO-FGETSTRING f str) " 类似上一个函数,但对\r\n进行处理"
INI 文件的处理: Possible Extension 要求(std-require 'INIFILE)
(INIFILE-GET section entry filename) "和doslib1.4 中的dos_getini类似,读取filename这个ini文件中section段的entry内容"
(INIFILE-SET section entry string filename) 对Ini文件的entry段进行内容添加
注册表项 ,要求(std-require 'REGISTRY) ,只对windows进行定义.
(REGISTRY-READ path key) 获取键值
(REGISTRY-WRITE path key value) 改变键值
(REGISTRY-DELETE key) 删除一个键或者空的注册树
(REGISTRY-DESCENDENTS key) 用表给出各个子键值
(REGISTRY-VALUES key) 给出各个子键值
(REGISTRY-ACAD-PRODUCT-KEY) " 给出这个路径""Software\\Autodesk\\AutoCAD\\R14.0\\ACAD-2450602:33318886"""
"用户输入,模拟一些autocad的文件对话框,扩展getfiled"
(STD-GETFILEM msg def ext flag) 同时获取多个文件的对话框
(STD-SHOWFILE fname) 类似acad的命令about
(STD-SHOWFILE-DIALOG fname title action) 与上类似.

从定制AutoCAD软件菜单的痛苦中逃离

翻译下面一篇cadalyst的Lynn Allen的文章。翻译水平比较一般,只好凑合看看了:)
http://management.cadalyst.com/cadm...l.jsp?id=170617

Circles and Lines: Taking the Pain Out of Customizing AutoCAD Menus,If you are new to customizing AutoCAD, CUI is for you.
圆和线∶从定制AutoCAD软件菜单的痛苦中逃离--

如果你对AutoCAD软件的定制不熟悉,CUI是对你最好的工具。

Oct 14, 2005
By: Lynn Allen
Cadalyst
Customization has changed in AutoCAD 2006. You no longer have to know the cryptic code of the ACAD.MNS file. You no longer need to figure out the difference between the MNU, MNS, MNR, MNL and MNX
file (yikes!). Now it's as easy as drag and drop -- very similar to that which you've experienced with the friendly AutoCAD toolbars. Those of us who have been customizing our menus for quite some time were skeptical at first. We (sadly) know the difference between all those scary file types. But now ever
yone has a chance to participate in the power of customizing -- and isn't that much better? Let's share the wealth a little!
AutoCAD2006 在定制方面已经发生了变化。你不再需要认识类似密码一样的acad.mns文件了。你不再需要明白mnu,mns,mnr,mnl,mnx之间的区别了。 现在它就如同拖放一样简单了,很类似于你在友好的AutoCAD工具栏那里得到的体验。我们这些长期以来自定义菜单的老家伙起先都是不相信的。我们曾经 (悲伤地)认识到这些令人恐怖的文件之间的差别。但是现在人人都有机会和权利去定制菜单了--这不是更好么?让我们一起来看看这笔财富!


The new CUI (Customization User Interface) has received some bad press, primarily because it's different. Those of you who know how to program menus the old way aren't forced to change -- you can still create your menus and then transfer them into the CUI. The new ACAD.CUI file is XML based, as opposed to the ASCII text files of the past. XML gurus technically can edit the XML file directly, but it's REALLY not recommended. This article will primarily focus on users who are new to the customizing process and who want to gain a little more control over their AutoCAD environment.

因 为它的不同以往,新的CUI(定制用户界面)已经受到了一些坏的批评。那些知道如何定义程序菜单的高手不愿意改变,但是仍然可以建立你的菜单文件再把他们 转为换成将他们转换成cui。新的cad.cui文件是建立在xml的基础上的,这个和以前的ASCII文本文件不一样。虽然xml
gurus技术可以直接地编辑xml文件,但是我们不推荐这种方法。本文的主要目的集中在那些希望定制和想获得更多AutoCAD环境控制的新手。


Jump In!
The CUI is a one-stop shop for customizing. Here you can customize your toolbars, your pull-down menus, your right-click shortcut menus and your keyboard shortcuts (accelerators). You can even customize your tablet menus, image tile menus and the good old screen menu (listed under Legacy in the
dialog box). The one thing you won't use the CUI for is the tool palette -- that's still done dynamically directly on the palette.
进入!
CUI 是个定制的一站式大商店。在这里你可以定制你的工具栏、你的下拉菜单、你的右键快捷菜单和你的快捷键(加速)。你甚至可以定制你的数字化仪菜单、图像平铺 菜单和古老的屏幕菜单。但有一样东西你不会使用CUI来完成的,那就是工具调色板,因为它仍然需要在palette调色板上直接完成。


To get started, simply execute the CUI command. Key it in or right-click on any toolbar and select Customize from the menu. In general, the types of menus are listed in the upper left corner of the CUI, the AutoCAD commands are listed in the lower left corner, and the actual customizing will occur on the right side (figure 1).

要开始的话,仅需执行CUI命令。键入这个命令,或者在工具栏上右击并选择定制。通常菜单类型是列在CUI的左上角、AutoCAD命令是列在左下角,实际定制出现在右边(图表1)。



Figure 1. The CUI dialog box.
图1 CUI对话框

Let's add another pull-down menu of our favorite commands to the existing AutoCAD menu.
Select Menus from the CUI to display a list of the current pull-down menus. Right-click on any of the menus, and select New to create a new pull-down. Enter "Favorites" as the title. This will place our menu at the end of the list. Drag the new menu between Tools and Draw (figure 2). Now you're ready to drag and drop your favorite commands into your new menu.

让 我们把我们的喜爱的命令(命令收藏夹)的下拉菜单加入到现有的AutoCAD软件菜单中。从CUI中选择菜单显示一列当前的下拉菜单。在任何菜单右击,选 择new(新建)建立一新下拉菜单。输入"Favorites"(收藏夹)作为标题。这会在列表的末端放置我们的菜单。拖该菜单到Tools工具和 Draw绘画之间(图2),现在你就可以拖放你喜爱的命令到你的菜单里了。


Figure 2. Creating a new pull-down menu in the CUI.
图形⒉在CUI建立一新下拉菜单。

Simply select your commands one by one from the list in the lower left corner. I've added Trim, Copy, Move, Offset and Insert for my list (figure 3). Select the command and then drag and drop them to the Favorites menu. You can key in the first letter of the command you want, and the CUI will jump to the commands that begin with that letter. After adding them to your menu, feel free to move them around to get them in the desired order. Select OK to save and exit the dialog box, and then take a look at your masterpiece!
只须一个接一个从该列表的左下角选择你的命令然后拖放就可以了,我已经添加Trim,Copy, Move, Offset和Insert到我的列表中(图3),选择该命令然后把拖放他们到收藏夹菜单中。你可以键入你需要命令的第一字母,然后CUI会跳到那些由那 字母开始的命令(译注:在中文cad2006中我发现不能这样)。在添加它们到你的菜单以后,就可以按照你要求的次序来移动它们。选择OK保存和退出对话 框、然后看看你的杰作!


Figure 3. A sample customized menu of favorite commands.
图形⒊一个定制喜爱命令的菜单样品。

Location,Location, Location
So is your new menu in the right location? Probably not.
Even though the CUI displays it in the right location in the list, your Favorites menu is probably the very last menu -- what's up with that? If you go back into the CUI and select your new menu, you'll see that the new menu has an alias of POP12 (or something similar). Each of the pull-down menus has a number assigned to it. The File menu is POP1, Edit is POP2, etc. This is the order the pull-down menus will display. So even though you drag your menu to a different location,it's still hard-coded to move to the end. You can manually change the various numbers to get it in the proper location or just leave it at the end.

位置、位置、位置
你 的菜单在正确的位置么?大概没有。即使CUI显示它在列表的正确位置、你的收藏夹菜单是大概还是在最后的菜单,为什么?如果你回到CUI里面并选择你的菜 单、你将看到新菜单已经有一个别名叫pop12(或其他类似的)。每一个下拉菜单都已经分配了一数字,比如文件菜单是POP1,编辑菜单是POP2等等, 这个是下拉菜单将显示的次序。所以,即使你硬拉你的菜单到一不同的位置处、它仍然会固执的跑到最后。你可以人工地改变数字使得它去到正当的位置或就让它放 在最后。

You are currently editing the AutoCAD menu (ACAD.CUI). If you decide to upgrade to the next release of AutoCAD, you'll find that the corresponding ACAD.CUI will override this one, and it will be very difficult for you to migrate your precious customizing. For this reason, you might find it better to create a partial menu.
It's easy to insert a partial menu into this and subsequent releases of AutoCAD.
The Express Menu is an example of a partial menu -- it's simply added into the AutoCAD menu environment. Let's look at the procedure for that (only slightly different and just as easy!).

你 现在正在编辑的是AutoCAD菜单(acad.cui),如果你决定升级到下一个AutoCAD版本,那么你将发现对应的acad.cui会替换现在这 个cui,这将使得移植你最喜欢的定制变得非常困难。为此你最好建立一局部的菜单。而将一局部的菜单插入到这个版本和以后版本的AutoCAD是很容易 的。Express
菜单就是一局部的菜单的例子,它只须添加到AutoCAD菜单环境里面。让我们看看这个流程(仅仅稍有不同但也非常简单)

Partial Menus
From the upper left corner of the CUI, select Partial CUI Files. You'll find a partial menu called Custom that Autodesk has earmarked for you to use for your own customization purposes. Select Custom, and then follow very similar steps as before. Select Menu/ (right-click) / New/ Menu. Name this one Favorites2 and add the commands just as before (figure 4).

局部菜单
从CUI 的左上角选择局部的CUI文件。你将发现一个叫做Custom的局部菜单,这个是Autodesk专门给你作定制用的。选择Custom,然后遵循如前所 述的非常类似的步骤。选择菜单/(右击)/新/菜单。把这个命名为favorites2并且如前面一样添加该命令(图4)。


Figure 4. Creating a partial menu in the CUI.
图形⒋建立一局部的菜单在该CUI。

So Favorites2 should now be the last of the pull-down menus. We used to be able to specifically control where the partial menus appeared within the pull-downs with the Menuload command, but if that functionality still exists in AutoCAD 2006,
I couldn't find it. It's not the end of the world, but it would be nice if we could control where the partial menus landed. You can still control them through AutoLISP for you LISPers out there.

那么favorites2现在是最后一个下拉菜单了。我们曾经能够通过Menuload命令来明确地控制局部的菜单出现在下拉菜单的哪个部分,但是我却找不到这个功能了,虽然menuload还存在于AutoCAD
2006里面的话。尽管还没到山穷水尽的地步,但是如果我们可以控制局部的菜单的位置的话那该多好啊。当然你仍然可以通过autolisp来控制它们。


Just a quick look at the other tools in the customization section of the CUI (figure 5): you can load a partial CUI file from disk by selecting the first tool. The second tool lets you save all of your current customization files (can't make out what the difference is between this and Apply).

下面再稍微对CUI的定制部分瞄一眼(图5)。你可以通过选择第一个图标工具来从一个磁盘中载入一个局部的的CUI文件。而第二个图标工具让你保存所有你的当前的定制文件(还弄不懂这和Apply的区别)。




Figure 5. Tools in the customization section of the CUI.
图形⒌在CUI定制部分的工具


Figure 6. The Display Filters dialog box controls what appears in the CUI dialog box.
图形⒍显示过滤器对话框控制什么将出现在CUI对话框中。

The last tool displays the dialog box displayed in figure 6. The Display Filters dialog box allows you to control just exactly what displays in the CUI dialog box (making it easier for you to work on the different customization types). If you're only working on menu customization, you might choose to turn off toolbars, mouse buttons,legacy, etc. This is very similar to the layer filter concept.
For those of you who are transferring your old menus into AutoCAD 2006, be sure to install Service Pack 1. This will ensure your menus are imported into AutoCAD in the best possible shape.
This is just an introductory look at the new CUI. Next month we'll dive deeper and take a look at some of the other sections.
Happy customizing and happy AutoCAD-ing!

图形⒍展示了图5中最后一个图标工具显示的对话框,显示过滤器的对话框允许你控制哪些东西在CUI对话框中显示(这方便你对不同的定制类型进行操作),如果你是仅仅是对菜单定制的话,那么你可以关掉工具栏、鼠标按纽、传统设置等等,这很类似于层过滤器概念的。
对那些传递你的老菜单到AutoCAD2006里的,切切要安置Service
Pack 1.这会确保你的菜单是完美的带进AutoCAD中。
这只是一个新CUI的简介。下月我们将钻研其他的部分。
幸福的定制和幸福地使用AutoCAD。

By
qjchen