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) 与上类似.