明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 922|回复: 12

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

[复制链接]
发表于 2019-11-20 23: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)
   )
   )
   )

)
发表于 2019-11-21 09:44 | 显示全部楼层


  1. (defun c:tt ()
  2.   (setq a (ssget ()))
  3.   (setq n 0)
  4.   (if (/= a nil)
  5.     (progn
  6.       (setq L (sslength a))
  7.       (repeat L
  8.         (setq b (entget (ssname a n)))
  9.         (setq c (assoc 40 b))
  10.         (entmod (subst (cons 40 100) C B));;把40改成100
  11.         (setq n (+ n 1))
  12.       )
  13.     )
  14.   )
  15. )
回复 支持 0 反对 1

使用道具 举报

发表于 2019-11-22 16:58 | 显示全部楼层
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。任何不是表的变量都认为是元素原子。

发表于 2019-11-22 16:51 | 显示全部楼层
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))



 楼主| 发表于 2019-11-21 10:47 | 显示全部楼层
非常不错,谢谢你的帮助
发表于 2019-11-21 11:21 | 显示全部楼层
(if(/= a nil)....)
可以简写成
(if a .....)
也可以扩写成
(if (= 'PICKSET (type a))....)
先判断a是不是选择集.
(setq L (sslength a ))
(repeat L ...)
可以合并为
(repeat (sslength a ) ...)
省略一个中间变量
另外if后只有一个分支,可以去掉progn函数
建议把局部变量加上去.
发表于 2019-11-21 11:34 | 显示全部楼层
(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 | 显示全部楼层
非常简洁干净,少了很多变量
 楼主| 发表于 2019-11-21 22:08 | 显示全部楼层
本帖最后由 wanchr 于 2019-11-21 23:30 编辑

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

发表于 2019-11-22 14:52 | 显示全部楼层
  1. (defun c:tt(/ a n)
  2.   (if(setq n 0 a(ssget'((0 . "TEXT"))))
  3.     (repeat(sslength a)
  4.       (entmod(append(entget(ssname a n))'((40 . 100))))
  5.       (setq n(1+ n))
  6.       )))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 02:50 , Processed in 0.462259 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表