wanchr 发表于 2019-11-20 23:58:58

我想问个修改字体组码的问题

(defun c:tt()
(setq a(ssget()))
(setq n 0)
(if(/= a nil)
(progn
(setq L (sslength a ))
(repeat L
   (setq b (entget(ssname a n )))
   (setq c(assoc 40 b))我要改40里的值,要怎么改,改完字体会变大不
    n(+ n 1)
   )
   )
   )

)

琴剑江山_10184 发表于 2019-11-21 09:44:13



(defun c:tt ()
(setq a (ssget ()))
(setq n 0)
(if (/= a nil)
    (progn
      (setq L (sslength a))
      (repeat L
        (setq b (entget (ssname a n)))
        (setq c (assoc 40 b))
        (entmod (subst (cons 40 100) C B));;把40改成100
        (setq n (+ n 1))
      )
    )
)
)

wyl219 发表于 2019-11-22 16:58:54

wanchr 发表于 2019-11-21 22:08
5楼就是专业的了,我菜鸟,还没好好看书,能解释一下(cons 40 100) 结果是(40 . 100) ,这个 ...

cons函数的参数有两个,均可以是任何元素或表,而点对是一种特殊的表.作用分两种,当第二个参数是表的时候(第二个参数是点对的时候也是这种情况),是将第一个参数原样插入到第二个元素的最前,返回值是一个表

当第二个参数是元素的时候,是与第一个参数的原样生成一个点对.
所以(cons 40 表)和(cons 40 元素)都是正确的使用方法.

注:所有非表的数据类型都是元素,包括实数,整数,字符串,ename等

(atom item)参数item任意 AutoLISP 项。某些版本的 LISP 对 atom(原子)的解释有些不同,所以在使用移植的代码时应加以注意。返回值如果 item 是表,则为 nil,否则为 T。任何不是表的变量都认为是元素原子。

wyl219 发表于 2019-11-22 16:51:30

wanchr 发表于 2019-11-21 22:08
5楼就是专业的了,我菜鸟,还没好好看书,能解释一下(cons 40 100) 结果是(40 . 100) ,这个 ...

(cons 40 100)->(40 . 100);点对
(list 40 100)->(40 100);表
点对和表不一样,很简单的一点就是用cdr处理.(car对于两者是相同的)
(cdr (cons 1 2)->2
(cdr (list 1 2) ->(2)

对于图元信息表,是一个点对组成的列表.
(cons 41 '( 40 100))->(41 40 100)
(cons 41 '(40 . 100))->(41 40 . 100);注意这个点
(list 41 '(40 100))->(41 (40 100))
另外
(append '( 41) '(40 100))->(41 40 100)
(cons '(41) '( 40 100))->((41) 40 100)
(list '(41) '(40 100))->((41) (40 100))



wanchr 发表于 2019-11-21 10:47:01

非常不错,谢谢你的帮助

wyl219 发表于 2019-11-21 11:21:30

(if(/= a nil)....)
可以简写成
(if a .....)
也可以扩写成
(if (= 'PICKSET (type a))....)
先判断a是不是选择集.
(setq L (sslength a ))
(repeat L ...)
可以合并为
(repeat (sslength a ) ...)
省略一个中间变量
另外if后只有一个分支,可以去掉progn函数
建议把局部变量加上去.

wyl219 发表于 2019-11-21 11:34:36

(defun c:tt ( / a b n)
        (while (not (setq a (ssget(list (cons 0 "*TEXT"))))));选择集筛选文字对象,当未获得选择集时重新获取
      (repeat (setq n (sslength a))
      (setq b (entget (ssname a (setq n (1- n)))))
      (entmod (subst (cons 40 100) (assoc 40 b) b));;把40改成100
      )
)
更简洁些.而且可读性不会降低很多

烟盒迷唇 发表于 2019-11-21 17:50:49

非常简洁干净,少了很多变量

wanchr 发表于 2019-11-21 22:08:15

本帖最后由 wanchr 于 2019-11-21 23:30 编辑

5楼就是专业的了,我菜鸟,还没好好看书,能解释一下(cons 40 100) 结果是(40 . 100) ,这个”."是什么意思
我看说明里(cons 40 表) 100的位置是个表
不理解

llsheng_73 发表于 2019-11-22 14:52:38

(defun c:tt(/ a n)
(if(setq n 0 a(ssget'((0 . "TEXT"))))
    (repeat(sslength a)
      (entmod(append(entget(ssname a n))'((40 . 100))))
      (setq n(1+ n))
      )))
页: [1] 2
查看完整版本: 我想问个修改字体组码的问题