明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1132|回复: 10

[讨论] 新手编程求助帖,一个自己编的lisp小程序遇到了一个坎,求助

[复制链接]
发表于 2015-4-12 12:36 | 显示全部楼层 |阅读模式
一个自己编的lisp小程序遇到了一个坎,求助!!!!

首先我来简单说下这个程序的功能:我是做结构设计的,希望将CAD中的文字(例如“20.0-80.8-24.0”)进行拆分,就是根据文字中的“-”这个字符为定位,将“-”之前之后的文字都分拆出来,(就是拆成"20.0",“80.8”,“24.0”三个独立部分),我程序已经写了一半,但是遇到一个棘手问题,先上代码然后说问题:

;以下开始主程序

(defun C:CFWZ ( )

(princ "\n请选择文字:")

(setq ss1 (ssget (list (cons 0 "TEXT") )))

  (setq i 0)

;;以下开始循环,循环的作用是处理大片文字。

  (repeat (sslength ss1)

  (setq a (entget (ssname ss1 i)))

    (setq WENZI  (cdr (assoc 1 a)));;获得配筋值

    (setq POINT  (cdr (assoc 10 a)))

    (setq HIGHT  (cdr (assoc 40 a)))

    (setq ANG1    (cdr (assoc 50 a)))

    (setq ANG    (* (/ ANG1 3.1415926 ) 180))

        (setq t1(vl-string-search "-" WENZI ))

  (setq t2(vl-string-search "-" WENZI  (+ t1 1)))

  (setq t3(- t2 t1 1))

  (setq W1(substr WENZI 1 t1))

  (setq W2(substr WENZI (+ t1 2 ) t3))

  (setq W3(substr WENZI (+ t2 2 ) ))

      (command "-text" POINT HIGHT ANG w1 "ESC")


    )

)

本人刚自学这个LISP编程,写的比较混乱,现在问题就是在最后一行运行 (command "-text" POINT HIGHT ANG w1 "ESC")这个命令的时候解决了第一个文字书写,但是到第二个文字书写的时候不知道插入点该怎么输,我是希望分拆后的文字能跟原文字重合,但是第二个文字“80.8”的定位就不好解释了,各位有什么好办法吗?第二个文字单位解决了的话第三个文字定位就迎刃而解了。



 楼主| 发表于 2015-4-12 12:37 | 显示全部楼层
一楼沙发自己坐了[img][/img]
发表于 2015-4-12 16:56 来自手机 | 显示全部楼层
我有一个笨方法,就是第二个文字第三个文字的位置跟第一个一样,只不过第二个文字内容前加5个空格,第三个前加10个空格……
发表于 2015-4-12 19:55 | 显示全部楼层
计算第二组文字插入点的位置,相对第一点加上“20.0-”的宽度。
 楼主| 发表于 2015-4-12 20:13 | 显示全部楼层
aihuyujian 发表于 2015-4-12 16:56
我有一个笨方法,就是第二个文字第三个文字的位置跟第一个一样,只不过第二个文字内容前加5个空格,第三个前 ...

嗯,这方法虽然比较偏门,但是实在没办法的话也是可行的
 楼主| 发表于 2015-4-12 20:16 | 显示全部楼层
xm56028 发表于 2015-4-12 19:55
计算第二组文字插入点的位置,相对第一点加上“20.0-”的宽度。

对啊,关键是这个宽度不好算,文字有哪个群码是对应文字宽度的?如果没有的还得自己算那就比较麻烦了,而且一旦文字分解的多了以后,程序就会很慢。或者说有没有识别文字的结束点坐标?这样倒也可以
发表于 2015-4-13 22:24 | 显示全部楼层
本帖最后由 pannelchen 于 2015-4-13 22:28 编辑

同职业顶下,我学cad编程也不久

;;(str2lst1 str) 将输入的数据转换为字符串列表.-----------------------------梁雄啸.2004.3
;;测试: (str2lst1  "Hello 2World 12 5456.1568") = ("Hello" "2World" "12" "5456.1568")
;对字符也有效
;(defun str2lst1 (str / i)
; (while (setq i (vl-string-search " " str (if i (+ 2 i)  0 )))
  ;  (setq str (vl-string-subst "\"\"" " " str i))  
; )
; (read (strcat "(\"" str "\")")) ;首尾加
;)

(str2lst1  "Hello-2World-12-5456.1568" "-") = ("Hello" "2World" "12" "5456.1568")
;; 以下程式是改编自上面程序代码
(defun str2lst1 (str splitkey / i)
  (while (setq i (vl-string-search splitkey str (if i (+ 2 i)  0 )))
    (setq str (vl-string-subst "\"\"" splitkey str i))
  )
  (read (strcat "(\"" str "\")")) ;返回字符串中的第一个表 ?
)
发表于 2015-4-14 23:42 | 显示全部楼层
请试试,是不是你想要的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-4-19 12:01 | 显示全部楼层
我的理解楼主不是卡在如何拆分上
而是卡在拆分后如何确定文字位置上
虽然拆分的语句不是那么严谨

首先学习一下textbox函数的用法
通过该函数可以获取某文字样式下一个字符串的长度

下面提供实现程序功能的思路
首先原位修改文字的节点方式为L
可以借用express里的JustifyText命令实现
获取拆分前字符串 A 的长度 LENA
拆分后各字符串连接成新的字符串 B
计算出 B 的长度 LENB
分割字符的数量为 N
(/ (- LENA LENB) N 1.0)
得到分割字符的平均宽度 LCUT
不要直接用textbox计算分隔符的宽度
因为可能求不出来——空格
求出来值也会偏小
然后
修改 A 字符串内容为 W1
复制 W1 距离为 W1 长度 LW1+LCUT
复制后文字内容改为 W2
依次类推

程序运行结果
原文字与拆分后的文字组
可能无法完全重合
这是没办法的

另外楼主写文字的语句是错误的
发表于 2015-4-19 19:10 | 显示全部楼层
如果没研究出来 。直接用文修工具。直接转换成单个数字。我就是这样处理。自己编写,太费劲了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 22:28 , Processed in 0.231066 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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