求助帮忙看看为啥运行不起
本帖最后由 duhan6401 于 2024-10-21 22:10 编辑我自己写了一个小程序,但是里面的循环一直不能正常运行下去,看哪个地方有问题了。附件里面的txt文件是要读取的数据,CAD是多段线,主要内容是想根据txt里面的第二列桩号数据,依次从对应的进口和出口处打断后偏移
[*](defun c:hlkx (/)
[*];l jzwjkzh jzwckzh oldstartpt oldendpt newstartpt newendpt jzwmcwzjzwmcwzpt0);;;根据桩号画外轮廓线
[*](vl-load-com)
[*](entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "CENTER") (cons 2 "建筑物轮廓线") (cons 62 3)))
[*](setq f (getfiled"选择文件""""txt"2));定义数据文件路径
[*](setq ff (open f "r"));读取模式打开文件
[*](setq s (read-line ff));读取第一行
[*](while s ;这行非空
[*] (setq ss (cons s ss));循环写入列表
[*] (setq s (read-line ff));循环读取下一行
[*])
[*](close ff);关闭文件
[*](setq jzwjcksj (reverse ss));读取到的字符表逆序
[*](setq jzwjcksj
[*] (mapcar
[*] '(lambda (x)
[*] (read (strcat "(" (vl-string-translate "," " " x) ")"))
[*] )
[*] jzwjcksj
[*] )
[*])
[*](setq en (car(entsel "\n选择渠道轴线:")))
[*](setq ptlst(vl-remove-if-not '(lambda (x) (member (car x) '(100 0 8 90 42 10)) )(entget en)) )
[*](setq i 0)
[*](repeat(length jzwjcksj) ;循环次数
[*] (setq jzwjkzh (cadr (nth i jzwjcksj)));取得第一个列表元素
[*] (setq jzwckzh (cadr (nth (+ 1 i) jzwjcksj)))
[*] (setq jzwmcwz (vl-princ-to-string(car (nth (+ 1 i) jzwjcksj))));建筑物名称
[*] (setq oldstartpt (vlax-curve-getStartPoint en ))
[*] (setq oldendpt (vlax-curve-getendPoint en ))
[*] (setq newstartpt (vlax-curve-getPointAtDist enjzwjkzh))
[*] (setq newendpt (vlax-curve-getPointAtDist enjzwckzh))
[*] (setq jzwmcwzpt0 (vlax-curve-getPointAtDist en (* 0.5 ( +jzwjkzh jzwckzh))))
[*] (setq l (/(nth 5 (nth (+ 1 i) jzwjcksj)) 2 ))
[*] (if (< l 2 )(setq l 2))
[*] (setq jzwmcwzpt (polar jzwmcwzpt0 (+ ( angle jzwmcwzpt0(mapcar'+(vlax-curve-getfirstDeriv en (vlax-curve-getParamAtPoint en jzwmcwzpt0)) jzwmcwzpt0))(* pi 0.5)) (+ 0.3 l)))
[*] (entmake (append (list (cons 0 "TEXT");;;类型
[*] (cons 7 "HZ1");;;样式
[*] (cons 1 jzwmcwz );;;内容
[*] (cons 8 "建筑物桩号及名称") ;;;图层
[*] (cons 40 (* 1000 0.04));;;文字高度
[*] (cons 41 0.6);;;宽度比例
[*] (cons 11 jzwmcwzpt) ;;;文字插入点坐标
[*] (cons 10 jzwmcwzpt)
[*] (cons 72 1)
[*] (cons 73 1)
[*] (cons50 ( angle jzwmcwzpt0(mapcar'+(vlax-curve-getfirstDeriv en (vlax-curve-getParamAtPoint en jzwmcwzpt0)) jzwmcwzpt0)))
[*] )
[*] )
[*] )
[*] (vl-cmdf "break" en "f" oldstartpt newstartpt )
[*] (vl-cmdf "break" en "f" oldendpt newendpt )
[*] (command "LAYER" "s" "建筑物轮廓线" "")
[*] (command "offset" "e" "y" "l" "c" "t" "")
[*] (command "offset" len"b" "");l为偏移距离,隧洞半径,渡槽一半
[*] (entmake ptlst )
[*] (setq en (entlast))
[*] (setq i (+ i 2))
[*])
[*])
楼主应该详细讲解程序的功能.
文本有7列,看不懂要干嘛.
程序下面这一行的"bl"未赋值
(cons 40 (* bl 0.04));;;文字高度 tigcat 发表于 2024-10-21 22:08
楼主应该详细讲解程序的功能.
文本有7列,看不懂要干嘛.
程序下面这一行的"bl"未赋值
文本中的第二列是桩号,第六列是是要偏移的宽度,是这个插件中用到的数字,第一行第二列桩号为起点第二行第二列桩号为终点,将轴线从这两个点断开后以第六列的数字作为宽度进行偏移,再重新生成一个新的轴线后,以第三行第二列桩号为起点,第四行第二列桩号为终点,将轴线再从这两个点断开后以第四行第六列的数字作为宽度进行偏移,这样一直循环到终点 本帖最后由 飞雪神光 于 2024-10-22 09:30 编辑
(command "offset" len"b" "")
这一句 我在07和21上都没有看到"b" 的命令流
还有最后i是+2递增的 repeat次数就要除以2
这个是不使用command命令的 速度要快一点 本帖最后由 飞雪神光 于 2024-10-22 11:51 编辑
还是有点瑕疵 飞雪神光 发表于 2024-10-22 08:42
这一句 我在07和21上都没有看到"b" 的命令流
还有最后i是+2递增的 repeat次数就要除以2
这个命令流是浩辰里面的 本帖最后由 duhan6401 于 2024-10-22 16:24 编辑
飞雪神光 发表于 2024-10-22 11:42
还是有点瑕疵
是哪个地方有问题循环不下去呢?给点指点呢.你编译的这个文件在浩辰里面加载不上。加载了就要崩溃。 1.未设置局部变量 尤其是变量ss
2.i是+2递增的 所以repeat次数要除以2 这也是循环不下去的主要原因
3. (setq l (/ (nth 5 (nth (+ 1 i) jzwjcksj)) 2.)) ;除数应该是实数
4.在 "家晚隧洞" "马草渡槽" 之间本来应该是 "余家隧洞" 但大概率会变成 "乐宜分水"
也就是 (read (strcat "(" (vl-string-translate "," " " "余家隧洞 46748.8 436.543 余家隧洞出口 432.585 2.8 FALSE ") ")"))->(乐宜分水 46748.8 436.543 余家隧洞出口 432.585 2.8 FALSE) 好的,我再根据你的提示调试下。手工可以循环,就是不能自动
页:
[1]