找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2258|回复: 20

[已解决] 关于文字变线,我写了一个程序,但有各种问题,哪位大神能帮忙改改或说哪里有问题

[复制链接]

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-2-2 19:57:15 | 显示全部楼层 |阅读模式
悬赏40D豆已解决
菜鸟一枚,基础不牢。经常的问题是变量类型错误,错误命令“y” "2"。还有就是针对单个文字对象可以用,一到多少就不行,怎么改进呢。
;整体思路是将获得选择集后将每一个对象缩放至最大再wmfout wmfin,这样文字不会变形或者精度较低。
(defun c:t2b()
(setq ss(ssget) ;取选择集
      n(sslength ss)
      i 0 )
(while (<= i n )
        (setq ename(ssname ss i)) ;取第i个对象的名称
        (setq ent(entget ename)  ;取得第i个对象属性
        high(cdr(assoc 40 ent))  ;取字体高度
        roang(cdr(assoc 50 ent)) ;取字体旋转角度
        stroang(distof(angtos roang 0 0)2) ;角度转化为弧度值
        troang (- 360 stroang)  ;取得为将文字转回水平所需度数
        keypt(cdr(assoc 10 (entget ename)))) ;取得字体插入点
        (command "rotate" ename "" keypt (rtos troang) "") ;将字体旋转回水平角度
          (command "ucs" "n" keypt)  ;将字体插入点设为ucs原点
        (setq txtbox(textbox ent)
        fstpt(car txtbox)
        scdpt(cadr txtbox)
        scdptx(car scdpt)
        fstptx(car fstpt)
        halfptx(/ (+ fstptx scdptx)2)) ;取得字体包围框,算出包围框中点值
  (setvar "osmode" 0)
(setvar        "mirrtext" 1)
(command "zoom" "w" fstpt (list scdptx high) "") ;将字体缩放至最大范围
  (setq highsz(getvar "viewsize")
        scrsz(getvar "screensize")
        vcr(getvar "viewctr")
        widesz(*(car scrsz)(/ highsz (cadr scrsz)))
        insptx(-(car vcr)(/ widesz 2))
        inspty(+(cadr vcr)(/ highsz 2))
        inspt(list insptx inspty))   ;获得屏幕左上角坐标做为wmfin插入点
(command "mirror" ename "" (list halfptx 0) (list halfptx high) "y" "")  ;以字体中心镜像
(command "wmfout" "t2lb" ename "")
(command "wmfin" "t2lb" inspt "2" "2" "0")
  (command "explode" (entlast) "")
(command "mirror" (ssget "p") "" (list halfptx 0) (list halfptx high) "y") ;镜像回来
   (command "rotate" (ssget "p") "" (list 0 0) stroang  "")  ;旋转回来
(command "erase" ename "")
         (command "ucs" w) ;变回世界坐标
        (setq i(1+ i))
        )       
)

最佳答案

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 5604个

财富等级: 富甲天下

发表于 2018-2-2 19:57:16 | 显示全部楼层
本帖最后由 HLCAD 于 2018-2-3 10:58 编辑

  1. ;;; by HLCAD
  2. (defun c:t2b(/ CMDECHO ENAME ENT FSTPT FSTPTX HALFPTX HIGH HIGHSZ
  3.              I INSPT INSPTX INSPTY KEYPT MIRRTEXT ROANG SCDPT
  4.              SCDPTX SCRSZ SS STROANG TROANG TXTBOX VCR WIDESZ)
  5.   (setq cmdecho (getvar "cmdecho"))
  6.   (setq mirrtext(getvar "mirrtext"))
  7.   (setvar "cmdecho" 0)
  8.   (setvar "mirrtext" 1)
  9.   (setq ss(ssget '((0 . "TEXT"))) ;取选择集
  10.         i 0
  11.         )
  12.   (while (< i (sslength ss))
  13.     (setq ename(ssname ss i)) ;取第i个对象的名称
  14.     (setq ent(entget ename)   ;取得第i个对象属性
  15.           high(cdr(assoc 40 ent))  ;取字体高度
  16.           roang(cdr(assoc 50 ent)) ;取字体旋转角度
  17.           stroang(distof(angtos roang 0 0)2)   ;角度转化为弧度值
  18.           troang (- 360 stroang)   ;取得为将文字转回水平所需度数
  19.           keypt(cdr(assoc 10 (entget ename)))) ;取得字体插入点
  20.     (command "_.rotate" ename "" "_non" keypt (rtos troang)) ;将字体旋转回水平角度
  21.     (command "_.ucs" "_n" "_non" keypt) ;将字体插入点设为ucs原点
  22.     (setq txtbox(textbox ent)
  23.           fstpt(car txtbox)
  24.           scdpt(cadr txtbox)
  25.           scdptx(car scdpt)
  26.           fstptx(car fstpt)
  27.           halfptx(/ (+ fstptx scdptx)2)) ;取得字体包围框,算出包围框中点值
  28.     (command "_.zoom" "_w" "_non" fstpt "_non" (list scdptx high)) ;将字体缩放至最大范围
  29.     (setq highsz(getvar "viewsize")
  30.           scrsz(getvar "screensize")
  31.           vcr(getvar "viewctr")
  32.           widesz(*(car scrsz)(/ highsz (cadr scrsz)))
  33.           insptx(-(car vcr)(/ widesz 2))
  34.           inspty(+(cadr vcr)(/ highsz 2))
  35.           inspt(list insptx inspty))   ;获得屏幕左上角坐标做为wmfin插入点
  36.     (command "_.mirror" ename "" "_non" (list halfptx 0) "_non" (list halfptx high) "_y")  ;以字体中心镜像
  37.     (command "_.wmfout" "t2lb" ename "")
  38.     (command "_.wmfin"  "t2lb" "_non" inspt "2" "2" "0")
  39.     (command "_.explode"(entlast))
  40.     (command "_.mirror" (ssget "_p") "" "_non" (list halfptx 0) "_non" (list halfptx high) "_y") ;镜像回来
  41.     (command "_.rotate" (ssget "_p") "" "_non" (list 0 0) stroang)  ;旋转回来
  42.     (command "_.erase" ename "")
  43.     (command "_.ucs" "_w") ;变回世界坐标
  44.     (setq i(1+ i))
  45.     )
  46.   (setvar "mirrtext" mirrtext)
  47.   (setvar "cmdecho"  cmdecho)
  48.   (princ)
  49.   )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-2-2 20:06:12 | 显示全部楼层
你去参照下  每日插件论坛里面那个  文字轮廓 的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-2 20:23:57 | 显示全部楼层

你的帖子我昨天也回了的,主要有两个问题1.为达到我的要求需要对每一个单行文字对象最大化视窗,否则会变形,我刚刚试了你的程序,确实是变形的。2.你的程序用了很多晓东函数,我看不大懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-2-2 20:31:31 | 显示全部楼层

怎么变形?  我测试过,文字之前显示是什么样的,转换后,还是贴和的,除非你认为原来文字就是变形的。
或许你是什么特殊的文字?

你把变形的前后对比截取个清楚的图片贴上来。

把DWG压缩传上来看看你的文字。

API函数有手册,可以看手册,知道是做什么的,如果想自己写函数的功能,可以根据函数的参数和返回值,自己去写黑匣子里面的东西。
这个程序没什么复杂的,没用几个函数。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-2 20:55:31 | 显示全部楼层
得到 错误命令“y” "2" 这样的,往往是给command的参数不对,有时候需要多个回车,你给的""数不对。
这时候就有个技巧,论坛也多次说过,就是用循环,判断是否在执行命令中,如果是给"" (默认的)或者 “Y”(具体分析)

需要都回车结束命令的
  1. (while  (= (getvar "cmdactive") 0)
  2.    (command "")
  3. )


需要一直用PAUSE和命令交互的
  1. (while  (= (getvar "cmdactive") 0)
  2.    (command pause)
  3. )



需要一直按Y的
需要一直用PAUSE和命令交互的
  1. (while  (= (getvar "cmdactive") 0)
  2.    (command "Y")
  3. )




上面这些适合你确定的参数都输入完后,不知道需要几个回车或者几个Y的情况。因为不同的命令需要的不一样。
上面这个循环就完美解决了。

点评

像这种循环怎么用呢,用于何处,能不能示例一下。  详情 回复 发表于 2018-5-12 01:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-3 13:53:42 | 显示全部楼层

版主你试试这个,我用你的程序选择行整体框选全部得到的结果有变形

test.rar

4.86 KB, 下载次数: 2, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-3 13:59:50 | 显示全部楼层

感谢啊,你说说你都做了啥,我原来的代码有什么问题,看你加了很多_.有什么用途
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-3 14:02:12 | 显示全部楼层

那个-non是什么
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-3 14:09:09 | 显示全部楼层

你这方法也挺好的,不过hlcad的方法好像更简洁哈。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-3 14:57:57 | 显示全部楼层

你能不能再看看这个,修改过的程序在遇到数字1时wmfout会把这个1省去,这是咋回事

test.rar

4.76 KB, 下载次数: 1, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 5604个

财富等级: 富甲天下

发表于 2018-2-3 15:00:03 | 显示全部楼层
你的程序大体上还可以,就是command的尾后多了回车,还有<=应该是<
"_non"的意义就是不采用捕捉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 5604个

财富等级: 富甲天下

发表于 2018-2-3 15:33:23 | 显示全部楼层

我这里,试了一下,都是可以的,使用的是2012,64位
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 5604个

财富等级: 富甲天下

发表于 2018-2-3 15:41:53 | 显示全部楼层
本帖最后由 HLCAD 于 2018-2-3 15:52 编辑

  1. ;;; 我刚好也需要这样一个程序,就简化和规范了一下程序,与大家共享
  2. ;;; by HLCAD
  3. (defun c:t2b(/ *error* CMDECHO ENAME FILE HIGHSZ INSPT MIRRTEXT SCRSZ SS VCR WIDESZ)
  4. ;;;
  5. (defun *error* (msg)
  6.   (while (= 1 (logand (getvar 'cmdactive) 1)) (command ""))
  7.   (if (= (logand (lsh (getvar "undoctl") -3) 1) 1)
  8.     (command "_.undo" "_End")
  9.     )
  10.   (if (and file (findfile file)) (vl-file-delete file))
  11.   (if mirrtext (setvar "mirrtext" mirrtext))
  12.   (if cmdecho  (setvar "cmdecho"  cmdecho))
  13.   (princ)
  14.   )
  15. ;;;
  16.   (setq cmdecho (getvar "cmdecho"))
  17.   (setq mirrtext(getvar "mirrtext"))
  18.   (setvar "cmdecho" 0)
  19.   (command "_.undo" "_g")
  20.   (setvar "mirrtext" 1)
  21.   (and (setq ss(ssget '((0 . "TEXT")))) ;取选择集
  22.        (setq ss (vl-remove-if 'Listp (mapcar 'cadr (ssnamex ss))))
  23.        )
  24.   (mapcar '(lambda(ename)
  25.   (progn
  26.     (command "_.zoom" "_o" ename "")
  27.     (command "_.regen")
  28.     (setq highsz(getvar "viewsize")
  29.           scrsz(getvar "screensize")
  30.           vcr(getvar "viewctr")
  31.           widesz(*(car scrsz)(/ highsz (cadr scrsz)))
  32.           inspt(list (-(car vcr)(/ widesz 2)) (+(cadr vcr)(/ highsz 2)));获得屏幕左上角坐标做为wmfin插入点
  33.           )
  34.     (command "_.mirror" ename "" "_non" vcr "_non" (polar vcr (angtof "90.0") 1.0) "_y") ;以显示屏中心镜像.
  35.     (setq file (strcat (getvar "DWGPREFIX") "t2lb.wmf"))
  36.     (command "_.wmfout" file ename "")
  37.     (command "_.wmfin"  file "_non" inspt "2" "2" "0")
  38.     (command "_.explode"(entlast))
  39.     (command "_.mirror" (ssget "_p") "" "_non" vcr "_non" (polar vcr (angtof "90.0") 1.0) "_y") ;镜像回来.
  40.     (command "_.erase" ename "")
  41.     (command "_.zoom" "_p")
  42.     )) ss)
  43.   (command "_.undo" "_End")
  44.   (if (and file (findfile file)) (vl-file-delete file))
  45.   (setvar "mirrtext" mirrtext)
  46.   (setvar "cmdecho"  cmdecho)
  47.   (princ)
  48.   )



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-2-5 13:40:04 | 显示全部楼层

我在cad2004里测试用不了,zoom之后有个命令“o”吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 01:05 , Processed in 0.523071 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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