病毒/太阳 发表于 2015-4-12 12:36:06

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

一个自己编的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:07

一楼沙发自己坐了

aihuyujian 发表于 2015-4-12 16:56:05

我有一个笨方法,就是第二个文字第三个文字的位置跟第一个一样,只不过第二个文字内容前加5个空格,第三个前加10个空格……

xm56028 发表于 2015-4-12 19:55:43

计算第二组文字插入点的位置,相对第一点加上“20.0-”的宽度。

病毒/太阳 发表于 2015-4-12 20:13:08

aihuyujian 发表于 2015-4-12 16:56 static/image/common/back.gif
我有一个笨方法,就是第二个文字第三个文字的位置跟第一个一样,只不过第二个文字内容前加5个空格,第三个前 ...

嗯,这方法虽然比较偏门,但是实在没办法的话也是可行的

病毒/太阳 发表于 2015-4-12 20:16:19

xm56028 发表于 2015-4-12 19:55 static/image/common/back.gif
计算第二组文字插入点的位置,相对第一点加上“20.0-”的宽度。

对啊,关键是这个宽度不好算,文字有哪个群码是对应文字宽度的?如果没有的还得自己算那就比较麻烦了,而且一旦文字分解的多了以后,程序就会很慢。或者说有没有识别文字的结束点坐标?这样倒也可以

pannelchen 发表于 2015-4-13 22:24:48

本帖最后由 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 "\")")) ;返回字符串中的第一个表 ?
)

xiahwan 发表于 2015-4-14 23:42:41

请试试,是不是你想要的

masterlong 发表于 2015-4-19 12:01:55

我的理解楼主不是卡在如何拆分上
而是卡在拆分后如何确定文字位置上
虽然拆分的语句不是那么严谨

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

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

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

另外楼主写文字的语句是错误的

lenovo1x1 发表于 2015-4-19 19:10:30

如果没研究出来 。直接用文修工具。直接转换成单个数字。我就是这样处理。自己编写,太费劲了。。
页: [1] 2
查看完整版本: 新手编程求助帖,一个自己编的lisp小程序遇到了一个坎,求助