明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 894|回复: 14

[源码] 南方cass高程点加常数or修改小数位数 lsp源码

[复制链接]
发表于 2024-7-18 10:53:07 | 显示全部楼层 |阅读模式
本帖最后由 yanshengjiang 于 2024-7-18 16:10 编辑

混迹明经十余年,没有认真学习,至今都只能东拼西凑。

今天没事把以前用autolisp写的程序用VL函数重写了一次

  1. (defun c:tt(/ *error* _startundo _endundo acdoc ss i tt len s b h id)
  2.   ;照搬 lee-mac的出错函数和undo标记,不知其所以然,也不知道对不对。
  3.     (defun *error* (msg)
  4.     (if        acdoc
  5.       (_endundo acdoc)
  6.     )
  7.     (or        (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  8.         (princ (strcat "\n** Error: " msg " **"))
  9.     )
  10.     (princ)
  11.   )

  12.   (defun _startundo (doc)
  13.     (_endundo doc)
  14.     (vla-StartUndoMark doc)
  15.   )

  16.   (defun _endundo (doc)
  17.     (while (= 8 (logand 8 (getvar 'UNDOCTL)))
  18.       (vla-EndUndoMark doc)
  19.     )
  20.   )

  21.   (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
  22.   
  23.   ;2024年7月18日 yanshengjiang 于g103.97695700,30.72349432
  24.   (princ"\n南方cass高程点加常数or修改小数位数.建议先执行一次cass命令:根据注记修改高程。")
  25.     ;(vl-catch-all-apply
  26.    ; '(lambda()
  27.   (setq ss(ssget '((2 . "gc200")(8 . "GCD")))
  28.   i -1)
  29.   (setq tt(getreal "\n输入要加的常数<负数表示减.如果只想改变位数那么直接回车+0 <0>"))
  30.   (if(null tt)(setq tt 0))
  31.   (setq len(getint  "\n输入要保留的小数位数<2>"))
  32.   (if(null len)(setq len 2))
  33.   (_startundo acdoc)
  34.   (repeat(sslength ss)
  35.     (setq s(vlax-ename->vla-object(ssname ss(setq i(1+ i)))))
  36.     ;高程点的一些操作,源自明经通道
  37.     (if (= (vla-Get-ObjectName s) "AcDbBlockReference")
  38.       (if (vla-Get-HasAttributes s)
  39.   (progn
  40.     (setq b(nth 0(vlax-safearray->list (vlax-variant-value(vla-GetAttributes s)))))
  41.           (setq h(read(vla-get-TextString b)))  ;高程点块的属性值  333.03
  42.           (setq id(vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint s))));块的三维插入点  (10.9191 10.7323 333.032)
  43.           (if(equal h (last id) 1e-1)(setq h(last id)));如果属性和Z值一样,就用z值来加减,防止损失毫米位精度
  44.           (setq h(+ tt h))
  45.           (setq id(list(car id)(cadr id) h))
  46.           (vla-put-insertionpoint s (vlax-3D-point id)) ;改变块的插入点
  47.           (vla-put-TextString b (rtos h 2 len))
  48.           )
  49.   )
  50.       )
  51.     )
  52.   (_endundo acdoc)
  53.      ;  ))
  54.   (prin1)
  55.   )


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-7-18 10:56:30 | 显示全部楼层
这是以前的版本:

  1. ;2011年12月11日 02:31:31 BY yanshengjiang
  2. ;于贵州晴隆                              
  3. (defun c:gcd(/ tt ss i s snext data old new len);高程加常数
  4.   (princ"\n南方cass高程点加常数 or 修改小数位数.建议先执行一次cass命令:根据注记修改高程。")
  5.   (vl-catch-all-apply
  6.     '(lambda()
  7.   (if(setq s(ssget "x" '((2 . "gc200")) ))
  8.    (if(setq ss(ssget '((2 . "gc200")) ))
  9.     (progn
  10.   (initget 1)
  11.   (setq tt(getreal "\n输入要加的常数<负数表示减.如果只想改变位数那么就输入0>>>"))
  12.   (initget 1)
  13.   (setq len(fix(getreal "\n输入要保留的小数位数>>>")))
  14.   (command "undo" "be")
  15.   (setq  i 0)
  16.   (while (< i (sslength ss))
  17.     (vl-catch-all-apply
  18.      '(lambda()
  19.   (setq s(Ssname ss i))
  20.   (setq snext(entnext s))
  21.   (setq data(entget snext))
  22. ;;;  (setq old (read(cdr(assoc 1 data))));调用属性值  改1位后不能再改两位
  23.   (SETQ old(last(assoc 10(entget s))));调用块插入点z坐标 而非属性值
  24.   (setq new (+ tt old))
  25.   (setq data(subst(cons 1 (rtos new 2 len)) (assoc 1 data) data))
  26.   (if(/= tt 0)
  27.     (progn
  28.   (setq data(subst(mapcar '+ (assoc 10 data) (list 0 0 0 tt)) (assoc 10 data) data))
  29.   (setq data(subst(mapcar '+ (assoc 11 data) (list 0 0 0 tt)) (assoc 11 data) data))
  30.         ))
  31.   (entmod data);修改位数
  32.   (if(/= tt 0)
  33.     (progn
  34.   (setq data(entget s '("*")))
  35.   (setq data(subst(mapcar '+ (assoc 10 data) (list 0 0 0 tt)) (assoc 10 data) data))
  36.   (entmod data)
  37.       ));如果要修改值
  38.   (entupd s);更新显示
  39.        ));出错处理2:如果有些gcd层的块没有高程属性,那么跳过这个并继续下一个
  40.   (setq i (1+ i))
  41.     (princ "\r已完成 ")
  42.     (princ (rtos (/ i (sslength ss) 0.01) 2 1))
  43.     (princ " %.")
  44.     (princ)
  45.     ) ;while
  46.   (command "undo" "e")
  47.   ));if progn
  48.     (alertt "没有找到GCD图层的块" 1 "CASS助手提示你" 48)
  49.   )));if vl-catch  出错处理1:静默所有出错提示
  50.   (princ)
  51.   )

发表于 2024-7-18 11:44:17 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-7-18 11:56 编辑
yanshengjiang 发表于 2024-7-18 11:21
测试两万个数据:AL写法用时8秒,新的VL写法用时10秒。

自从我知道有一个叫十亿行天文台数据挑战,我就觉得超过2秒的功能,真的好慢
 楼主| 发表于 2024-7-26 12:58:46 | 显示全部楼层
gzxl 发表于 2024-7-18 20:20
lisp 测试时间,不管是 autolisp,还是 vl
尽量代码简化,同等的条件下。
我知道本来 repeat nth 就耗费 ...

要while要好些哇  我试试
 楼主| 发表于 2024-7-18 11:21:19 | 显示全部楼层
测试两万个数据:AL写法用时8秒,新的VL写法用时10秒。
发表于 2024-7-18 18:52:07 | 显示全部楼层
你有种再说一遍 发表于 2024-7-18 11:44
自从我知道有一个叫十亿行天文台数据挑战,我就觉得超过2秒的功能,真的好慢

大神的眼界果然不同
发表于 2024-7-18 19:09:32 | 显示全部楼层
czb203 发表于 2024-7-18 18:52
大神的眼界果然不同

不说你们不转来c#,嘿嘿
发表于 2024-7-18 20:20:17 | 显示全部楼层
本帖最后由 gzxl 于 2024-7-18 20:24 编辑

lisp 测试时间,不管是 autolisp,还是 vl
尽量代码简化,同等的条件下。
我知道本来 repeat nth 就耗费时间,这很早就测试过了
不要加入 error command 等相关的代码
发表于 2024-7-18 21:10:20 | 显示全部楼层
源码分享 必顶
发表于 2024-7-19 10:28:16 | 显示全部楼层
yanshengjiang 发表于 2024-7-18 11:21
测试两万个数据:AL写法用时8秒,新的VL写法用时10秒。

那不是白写了。
发表于 2024-7-19 10:29:43 | 显示全部楼层
坐标暴露了,MG的导弹已锁定,快逃。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 11:50 , Processed in 0.180341 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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