乐筑天下

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

[编程交流] 尺寸和C的差异

[复制链接]

10

主题

45

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 17:04:14 | 显示全部楼层 |阅读模式
尊敬的大师们:,
 
我有一个lisp用于导出点。我交叉检查了excel值差异和auto cad尺寸。我观察到许多差异为0.01m的点。例如在auto cad绘图中显示1.71m,但通过excel坐标差为1.72。为什么显示0.01m的差异。请找到我的lisp并进行修改,以生成无差异的精确点。
  1. ;; Write CSV  -  Lee Mac
  2. ;; Writes a matrix list of cell values to a CSV file.
  3. ;; lst - [lst] list of lists, sublist is row of cell values
  4. ;; csv - [str] filename of CSV file to write
  5. ;; Returns T if successful, else nil
  6. (defun LM:writecsv ( lst csv / des sep )
  7.    (if (setq des (open csv "w"))
  8.        (progn
  9.            (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (",")))
  10.            (foreach row lst (write-line (LM:lst->csv row sep) des))
  11.            (close des)
  12.            t
  13.        )
  14.    )
  15. )
  16. ;; List -> CSV  -  Lee Mac
  17. ;; Concatenates a row of cell values to be written to a CSV file.
  18. ;; lst - [lst] list containing row of CSV cell values
  19. ;; sep - [str] CSV separator token
  20. (defun LM:lst->csv ( lst sep )
  21.    (if (cdr lst)
  22.        (strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep))
  23.        (LM:csv-addquotes (car lst) sep)
  24.    )
  25. )
  26. (defun LM:csv-addquotes ( str sep / pos )
  27.    (cond
  28.        (   (wcmatch str (strcat "*[`" sep ""]*"))
  29.            (setq pos 0)   
  30.            (while (setq pos (vl-string-position 34 str pos))
  31.                (setq str (vl-string-subst """" """ str pos)
  32.                      pos (+ pos 2)
  33.                )
  34.            )
  35.            (strcat """ str """)
  36.        )
  37.        (   str   )
  38.    )
  39. )
  40. ;; gc:distinct (gilles chanteau)
  41. ;; Suprime tous les doublons d'une liste
  42. ;;
  43. ;; Argument
  44. ;; l : une liste
  45. (defun gc:distinct (l)
  46.    (if l
  47.        (cons (car l) (gc:distinct (vl-remove (car l) l)))
  48.    )
  49. )
  50. (defun l-coor2l-pt (lst flag / )
  51.    (if lst
  52.        (cons
  53.            (list
  54.                (car lst)
  55.                (cadr lst)
  56.                (if flag
  57.                    (+ (if (vlax-property-available-p ename 'Elevation) (vlax-get ename 'Elevation) 0.0) (caddr lst))
  58.                    (if (vlax-property-available-p ename 'Elevation) (vlax-get ename 'Elevation) 0.0)
  59.                )
  60.            )
  61.            (l-coor2l-pt (if flag (cdddr lst) (cddr lst)) flag)
  62.        )
  63.    )
  64. )
  65. (defun c:ptdef2notepad ( / js dxf_cod mod_sel n lremov str_sep oldim ename l_pt l_pr pr l_x l_y tmp1 f_openx tmp2 f_openy)
  66. (princ "\nSelect model object for filtering: ")
  67. (while
  68.    (null
  69.      (setq js
  70.        (ssget "_+.:E:S"
  71.          (list
  72.            '(0 . "*LINE,POINT,ARC,CIRCLE,ELLIPSE,INSERT")
  73.            (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
  74.            (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
  75.          )
  76.        )
  77.      )
  78.    )
  79.    (princ "\nIsn't an available object!")
  80. )
  81. (vl-load-com)
  82. (setq dxf_cod (entget (ssname js 0)))
  83. (foreach m (foreach n dxf_cod (if (not (member (car n) '(0 67 410 8 6 62 48 420 70))) (setq lremov (cons (car n) lremov))))
  84.    (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod))
  85. )
  86. (initget "Single All Manual")
  87. (if (eq (setq mod_sel (getkword "\nSelect mode, [single/All/Manual]<Manual>: ")) "Single")
  88.    (setq n -1)
  89.    (if (eq mod_sel "All")
  90.        (setq js (ssget "_X" dxf_cod) n -1)
  91.        (setq js (ssget dxf_cod) n -1)
  92.    )
  93. )
  94. (setq
  95.    str_sep " "  ;-> **** YOU CAN CHANGE THIS STRING BY WHAT YOU WONT ! **** <-
  96.    oldim (getvar "dimzin")
  97. )
  98. (setvar "dimzin" 0)
  99. (repeat (sslength js)
  100.    (setq ename (vlax-ename->vla-object (ssname js (setq n (1+ n)))))
  101.    (setq l_pr (list 'StartPoint 'EndPoint 'Center 'InsertionPoint 'Coordinates 'FitPoints))
  102.    (foreach pr l_pr
  103.      (if (vlax-property-available-p ename pr)
  104.        (setq l_pt
  105.          (if (or (eq pr 'Coordinates) (eq pr 'FitPoints))
  106.            (append
  107.              (if (eq (vla-get-ObjectName ename) "AcDbPolyline")
  108.                (l-coor2l-pt (vlax-get ename pr) nil)
  109.                (if (and (eq pr 'FitPoints) (zerop (vlax-get ename 'FitTolerance)))
  110.                  (l-coor2l-pt (vlax-get ename 'ControlPoints) T)
  111.                  (l-coor2l-pt (vlax-get ename pr) T)
  112.                )
  113.              )
  114.              l_pt
  115.            )
  116.            (append (l-coor2l-pt (vlax-get ename pr) T) l_pt)
  117.          )
  118.        )
  119.      )
  120.    )
  121. )
  122. (setq l_x (gc:distinct (mapcar '(lambda (x) (rtos (/ x 1.0) 2 2)) (vl-sort (mapcar 'car l_pt) '<))))  ;-> **** YOU CAN CHANGE UNIT AND PREC (rtos x unit prec) ! **** <-
  123. (setq l_y (gc:distinct (mapcar '(lambda (x) (rtos (/ x 1.0) 2 2)) (vl-sort (mapcar 'cadr l_pt) '<))))  ;-> **** YOU CAN CHANGE UNIT AND PREC (rtos x unit prec) ! **** <
  124. (cond
  125.    (
  126.     (< (length l_x) (length l_y))
  127.     (while (< (length l_x) (length l_y))
  128.       (setq l_x (append l_x '("")))
  129.     ) ;_ >while
  130.    )
  131.    (
  132.     (> (length l_x) (length l_y))
  133.     (while (> (length l_x) (length l_y))
  134.       (setq l_y (append l_y '("")))
  135.     ) ;_ >while
  136.    )
  137. ) ;_ >cond
  138. (setq    l_x (append '("x") l_x)
  139.    l_y (append '("y ") l_y)
  140. ) ;_ >setq
  141.    
  142. (setq fn (getfiled "Create Output File" "" "csv" 1))
  143. (if (LM:WriteCSV (mapcar '(lambda (x y) (list x y))l_x l_y) fn)
  144.    (startapp "explorer" fn)
  145. )  
  146. ;;;  (setq
  147. ;;;    tmp1 (vl-filename-mktemp "tmp_x.csv")
  148. ;;;    f_openx (open tmp1 "w")
  149. ;;;  )
  150. ;;;  (mapcar '(lambda (x) (write-line x f_openx)) l_x)
  151. ;;;  ;(write-line (apply 'strcat (mapcar '(lambda (x) (strcat x str_sep)) l_x)) f_openx)
  152. ;;;  (close f_openx)
  153. ;;;  (startapp "notepad" tmp1)
  154. ;;;  (setq
  155. ;;;    tmp2 (vl-filename-mktemp "tmp_y.csv")
  156. ;;;    f_openy (open tmp2 "w")
  157. ;;;  )
  158. ;;;  (mapcar '(lambda (y) (write-line y f_openy)) l_y)
  159. ;;;  ;(write-line (apply 'strcat (mapcar '(lambda (x) (strcat x str_sep)) l_y)) f_openy)
  160. ;;;  (close f_openy)
  161. (startapp "notepad" tmp2)
  162. (setvar "dimzin" oldim)
  163. (prin1)
  164. )

 
请查找示例图纸和输出值excel文件。
误差为0.01。图纸
错误0.01。xlsx公司
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-5 17:16:22 | 显示全部楼层
这与您在AutoCAD中为单位指定的精度有关吗?
回复

使用道具 举报

10

主题

45

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 17:20:47 | 显示全部楼层
 
尊敬的先生:,
谢谢你的友好回复。是的,先生,我使用了-DWGUNITS命令。精度为2位。
 
 
谢谢你,
顺致敬意,
回复

使用道具 举报

8

主题

1133

帖子

1164

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 17:31:28 | 显示全部楼层
之所以会出现这种差异,是因为导出到csv文件的坐标已舍入,而AutoCAD中的坐标尚未舍入。
 
如果你像那样工作,你必须期望有细微的差别。
 
AutoCAD中小数点后4位的坐标为9.9822和11.6967,减去后为1.7145,四舍五入后为1.71(由尺寸确认)。
 
Excel中的数字分别为9.98和11.70,减去后得到1.72。
回复

使用道具 举报

10

主题

45

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 17:39:32 | 显示全部楼层
哦,我需要2位小数点坐标,比如1.71,excel中的数字也需要1.71。这怎么可能?有lisp程序吗?请建议。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:47:23 | 显示全部楼层
更改这两项:
  1. (rtos (/ x 1.0) 2 2)
至:
  1. (rtos x 2
,然后在计算后在Excel中四舍五入。
回复

使用道具 举报

10

主题

45

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 17:49:23 | 显示全部楼层
尊敬的李:,
谢谢你的回复。在auto cad坐标值修改的帮助下,再次显示3位以上的数字,如“9.9822”。但我需要将坐标设置为9.98(四舍五入到2位精度),并将相同的精确坐标值导出到CSV。任何lisp例程或lisp修改?
 
谢谢你,
顺致敬意,
回复

使用道具 举报

8

主题

1133

帖子

1164

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:03:46 | 显示全部楼层
我认为您必须在Excel中设置单元格格式,以显示小数点后2位。然后,当您保存到csv文件时,数字将根据您的需要而定。
180415qxed8h8bgwd78188.png
回复

使用道具 举报

10

主题

45

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 18:07:26 | 显示全部楼层
尊敬的Eldon:,
感谢您的回复。我知道两位数单元格的格式。
 
我在auto cad中尝试同样的2位数精度绘图。因为我想把我的画导出到另一个软件。我的导出excel绘图点和auto cad绘图点不重合。因此,请尝试将auto cad从4位精度缩放到2位精度,这些应与auto cad坐标匹配,导出的CSV点应相同。请在此帖子中找到帖子#1。
 
谢谢你,
顺致敬意,
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 09:14 , Processed in 0.822709 second(s), 72 queries .

© 2020-2025 乐筑天下

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