乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 79|回复: 5

[编程交流] [帮助]ATOF函数遍历la

[复制链接]

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 17:16:17 | 显示全部楼层 |阅读模式
你好,卡迪亚斯,
 
我在网上找不到这个问题的解决方案。谈到AutoLISP,我基本上也是一个新手,因为我只是临时学习了该语言,以满足我的业务的某些需要。
 
我有一个lisp例程,它读取一个文本文件,每一行都有坐标深度和描述。我使用substr函数从每一行中获取每一项信息。到目前为止,一切正常。
 
然而,当我使用ATOF(在一些测试之后)时,它将值舍入到6位有效数字。例如,如果我在字符串“543334.243”上使用ATOF,它返回543334.0,“9543334.243”返回9.54333e+06,“43334.243”返回43334.2。
 
因此,当我使用此例程创建具有6个以上有效数字的点时,我遇到了舍入问题。我可以使用其他功能吗?我试过DISTOF,但它给了我同样的结果。这是一个设置还是我可以改变的?
 
我目前正在使用AutoCAD 2017,我使用VLIDE编写和编辑我使用的代码。这段特定的代码不久前最初是为AutoCAD R14编写的,现在仍然有效。
 
这是代码
  1. ;READ_MRG.LSP
  2. ;reads ASCII M-file <name.ext> created by MERGE_WS.BAS
  3. ;and inserts PT blocks 950 on each layer of the type _PTS#
  4. ;format of file must be:
  5. ;Name/1-7, East/9-19, North/21-31, Depth/33-41, Rmks/43-55,
  6. ;Seabed GPS El 57-65, Acc 67-68, Exact 70-71
  7. ;Exact shows whether interpolation was needed
  8. ;Read Hydro in ACAD File|ASC In/Out calls this program
  9. ;----------
  10. (defun setcol()
  11.   (setq na1 1 na2 7 ea1 9 ea2 11 no1 21 no2 11 dp1 33 dp2 9
  12.         rm1 43 rm2 13 el1 57 el2 9 acc1 67 acc2 2 xa1 70 xa2 2)
  13. )
  14. ;----------
  15. (defun C:READ_MRG ( / fname s f tx name east north depth elev rmks pt1)
  16.   (setvar "ATTDIA" 0)
  17.   (setvar "ATTREQ" 1)
  18.   ;get existing file
  19.   (setq fname (getfiled "Select M... file: " "" "" 0))
  20.   (if f (close f))
  21.   (if (setq f (open fname "r"))
  22.      (progn
  23. ;         (command "LAYER" "M" "_weak" "")
  24. ;         (command "LAYER" "M" "_bad" "")
  25.         (princ "\nReading and inserting ...\n")
  26.         (setcol)
  27.         (setq tx (read-line f))
  28.         (setq lyrnum 0)
  29.         (setq ptnum 0)
  30.         (while tx
  31.            (if (= 0 ptnum)
  32.               (progn
  33.                  (setq lyrnum (+ 1 lyrnum))
  34.                  (command "LAYER" "M" (strcat "_PTS" (rtos lyrnum 2 0)) "")
  35.                  (setq ptnum 0)
  36.               )
  37.            )
  38.            (if (/= (substr tx 1 1) ";")    ;ignore remark and header lines
  39.               (progn
  40.                  (putpt)
  41.                  (if (= ptnum 949)
  42.                     (setq ptnum 0)
  43.                     (setq ptnum (+ 1 ptnum))
  44.                  )
  45.               )   
  46.            )
  47.            (setq tx (read-line f))
  48.         )  ;while tx
  49.         (close f)
  50.      )
  51.   )  ;if f
  52.   (princ)
  53. )
  54. ;----------
  55. (defun putpt ()
  56.   (setq
  57.      name (substr tx na1 na2)
  58.      east (substr tx ea1 ea2)
  59.      north (substr tx no1 no2)
  60.      depth (substr tx dp1 dp2)
  61.      rmks  (substr tx rm1 rm2)
  62.      elev  (substr tx el1 el2)
  63.      acc   (atoi (substr tx acc1 acc2))
  64.      xact  (substr tx xa1 xa2)
  65.      name (rtos (atof name) 2 0)
  66.      [color="red"]east (atof east)
  67.      north (atof north)
  68.      depth (atof depth)[/color]
  69.      pt1 (list east2 north2)
  70.   )
  71.   (if
  72.     (= depth2 -32767.0)
  73.       (setq depth2 "")
  74.       (setq depth2 (rtos depth 2 3))
  75.   )
  76.   (command "INSERT" "PT" pt1 1 1 0 depth2 name rmks)
  77. ;   (if
  78. ;     (> acc 3)
  79. ;       (command "CHPROP" "L" "" "LA" "_weak" "")
  80. ;   )
  81. ;   (if
  82. ;     (> acc 6)
  83. ;       (command "CHPROP" "L" "" "LA" "_bad" "")
  84. ;   )
  85. )

 
任何帮助都将不胜感激。提前谢谢。
 
罗宾
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 17:29:14 | 显示全部楼层
你不需要任何特殊功能。
仅为方便起见,截断了该值。
尝试将结果反转回字符串,您将看到所有的小数。
  1. (atof "9543334.243") -> 9.54333e+006
  2. (rtos (atof "9543334.243") 2 3) -> "9543334.243"
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 17:43:42 | 显示全部楼层
感谢您的回复,我突出显示的红色代码是我尝试存储这些atof值的地方,但当我运行例程时,结果是这些值被截断,因此我的所有点都位于错误的位置。我用VLIDE“watch window”查看在使用atof an后传递的值是什么,它在窗口中显示了截断的值(watch window不应该显示实际值吗?)。
在研究过程中,我读到AutoCAD内部保留了该值,但显示了一个截断值,但是该例程不显示任何文本,它使用从文本文件创建的变量来绘制点,这些点是用截断值创建的,因此所有点都在一条直线上,因此代码中有一些不正确的地方,但我无法理解。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:54:36 | 显示全部楼层
你在哪里定义east2和north2?
回复

使用道具 举报

lrm

1

主题

257

帖子

282

银币

限制会员

铜币
-13
发表于 2022-7-5 18:07:33 | 显示全部楼层
AutoCAD将坐标存储为双精度实数。这意味着数字大约有15到17个有效数字(参见https://en.wikipedia.org/wiki/Double-precision_floating-point_format了解更多信息)。
 
对于以下各项:
(setq x 123456789.123456789)
x将显示为:1.23457e+008
 
将x转换为字符串:
(setq xstring(rtos x))
收益率:“123456789.1234568”
 
将字符串转换为实数会产生以下显示值:
(setq xreal(atof xstring))
1.23457e+008
这意味着舍入为6位有效数字。
 
但是我们可以发现,从x的原始值中减去它,xreal具有更高的精度。
(setq dif(-x xreal))
-1.49012e-008
 
这表明x和xreal与16位有效数字相同(小数点前9位,小数点后7位)。xreal的精度高于其显示值。
 
小心不要将显示值与实际值混淆。
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:21:01 | 显示全部楼层
从调试开始,我将east和north的第二个引用更改为east2和north2,看看这是否有帮助。我在创建线程之前把它改回来了,但我错过了这两个
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 08:23 , Processed in 0.614284 second(s), 64 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表