pvsvprasad 发表于 2022-7-5 17:04:14

尺寸和C的差异

尊敬的大师们:,
 
我有一个lisp用于导出点。我交叉检查了excel值差异和auto cad尺寸。我观察到许多差异为0.01m的点。例如在auto cad绘图中显示1.71m,但通过excel坐标差为1.72。为什么显示0.01m的差异。请找到我的lisp并进行修改,以生成无差异的精确点。

;; Write CSV-Lee Mac
;; Writes a matrix list of cell values to a CSV file.
;; lst - list of lists, sublist is row of cell values
;; csv - filename of CSV file to write
;; Returns T if successful, else nil

(defun LM:writecsv ( lst csv / des sep )
   (if (setq des (open csv "w"))
       (progn
         (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (",")))
         (foreach row lst (write-line (LM:lst->csv row sep) des))
         (close des)
         t
       )
   )
)

;; List -> CSV-Lee Mac
;; Concatenates a row of cell values to be written to a CSV file.
;; lst - list containing row of CSV cell values
;; sep - CSV separator token

(defun LM:lst->csv ( lst sep )
   (if (cdr lst)
       (strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep))
       (LM:csv-addquotes (car lst) sep)
   )
)

(defun LM:csv-addquotes ( str sep / pos )
   (cond
       (   (wcmatch str (strcat "*[`" sep "\"]*"))
         (setq pos 0)   
         (while (setq pos (vl-string-position 34 str pos))
               (setq str (vl-string-subst "\"\"" "\"" str pos)
                     pos (+ pos 2)
               )
         )
         (strcat "\"" str "\"")
       )
       (   str   )
   )
)

;; gc:distinct (gilles chanteau)
;; Suprime tous les doublons d'une liste
;;
;; Argument
;; l : une liste
(defun gc:distinct (l)
   (if l
       (cons (car l) (gc:distinct (vl-remove (car l) l)))
   )
)
(defun l-coor2l-pt (lst flag / )
   (if lst
       (cons
         (list
               (car lst)
               (cadr lst)
               (if flag
                   (+ (if (vlax-property-available-p ename 'Elevation) (vlax-get ename 'Elevation) 0.0) (caddr lst))
                   (if (vlax-property-available-p ename 'Elevation) (vlax-get ename 'Elevation) 0.0)
               )
         )
         (l-coor2l-pt (if flag (cdddr lst) (cddr lst)) flag)
       )
   )
)
(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)
(princ "\nSelect model object for filtering: ")
(while
   (null
   (setq js
       (ssget "_+.:E:S"
         (list
         '(0 . "*LINE,POINT,ARC,CIRCLE,ELLIPSE,INSERT")
         (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
         (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
         )
       )
   )
   )
   (princ "\nIsn't an available object!")
)
(vl-load-com)
(setq dxf_cod (entget (ssname js 0)))
(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))))
   (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod))
)
(initget "Single All Manual")
(if (eq (setq mod_sel (getkword "\nSelect mode, <Manual>: ")) "Single")
   (setq n -1)
   (if (eq mod_sel "All")
       (setq js (ssget "_X" dxf_cod) n -1)
       (setq js (ssget dxf_cod) n -1)
   )
)
(setq
   str_sep " ";-> **** YOU CAN CHANGE THIS STRING BY WHAT YOU WONT ! **** <-
   oldim (getvar "dimzin")
)
(setvar "dimzin" 0)
(repeat (sslength js)
   (setq ename (vlax-ename->vla-object (ssname js (setq n (1+ n)))))
   (setq l_pr (list 'StartPoint 'EndPoint 'Center 'InsertionPoint 'Coordinates 'FitPoints))
   (foreach pr l_pr
   (if (vlax-property-available-p ename pr)
       (setq l_pt
         (if (or (eq pr 'Coordinates) (eq pr 'FitPoints))
         (append
             (if (eq (vla-get-ObjectName ename) "AcDbPolyline")
               (l-coor2l-pt (vlax-get ename pr) nil)
               (if (and (eq pr 'FitPoints) (zerop (vlax-get ename 'FitTolerance)))
               (l-coor2l-pt (vlax-get ename 'ControlPoints) T)
               (l-coor2l-pt (vlax-get ename pr) T)
               )
             )
             l_pt
         )
         (append (l-coor2l-pt (vlax-get ename pr) T) l_pt)
         )
       )
   )
   )
)
(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) ! **** <-
(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) ! **** <

(cond
   (
    (< (length l_x) (length l_y))
    (while (< (length l_x) (length l_y))
      (setq l_x (append l_x '("")))
    ) ;_ >while
   )
   (
    (> (length l_x) (length l_y))
    (while (> (length l_x) (length l_y))
      (setq l_y (append l_y '("")))
    ) ;_ >while
   )
) ;_ >cond

(setq    l_x (append '("x") l_x)
   l_y (append '("y ") l_y)
) ;_ >setq
   
(setq fn (getfiled "Create Output File" "" "csv" 1))
(if (LM:WriteCSV (mapcar '(lambda (x y) (list x y))l_x l_y) fn)
   (startapp "explorer" fn)
)

;;;(setq
;;;    tmp1 (vl-filename-mktemp "tmp_x.csv")
;;;    f_openx (open tmp1 "w")
;;;)
;;;(mapcar '(lambda (x) (write-line x f_openx)) l_x)
;;;;(write-line (apply 'strcat (mapcar '(lambda (x) (strcat x str_sep)) l_x)) f_openx)
;;;(close f_openx)
;;;(startapp "notepad" tmp1)
;;;(setq
;;;    tmp2 (vl-filename-mktemp "tmp_y.csv")
;;;    f_openy (open tmp2 "w")
;;;)
;;;(mapcar '(lambda (y) (write-line y f_openy)) l_y)
;;;;(write-line (apply 'strcat (mapcar '(lambda (x) (strcat x str_sep)) l_y)) f_openy)
;;;(close f_openy)

(startapp "notepad" tmp2)
(setvar "dimzin" oldim)
(prin1)
)

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

ReMark 发表于 2022-7-5 17:16:22

这与您在AutoCAD中为单位指定的精度有关吗?

pvsvprasad 发表于 2022-7-5 17:20:47

 
尊敬的先生:,
谢谢你的友好回复。是的,先生,我使用了-DWGUNITS命令。精度为2位。
 
 
谢谢你,
顺致敬意,

eldon 发表于 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。

pvsvprasad 发表于 2022-7-5 17:39:32

哦,我需要2位小数点坐标,比如1.71,excel中的数字也需要1.71。这怎么可能?有lisp程序吗?请建议。

Lee Mac 发表于 2022-7-5 17:47:23

更改这两项:
(rtos (/ x 1.0) 2 2)至:
(rtos x 2 ,然后在计算后在Excel中四舍五入。

pvsvprasad 发表于 2022-7-5 17:49:23

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

eldon 发表于 2022-7-5 18:03:46

我认为您必须在Excel中设置单元格格式,以显示小数点后2位。然后,当您保存到csv文件时,数字将根据您的需要而定。

pvsvprasad 发表于 2022-7-5 18:07:26

尊敬的Eldon:,
感谢您的回复。我知道两位数单元格的格式。
 
我在auto cad中尝试同样的2位数精度绘图。因为我想把我的画导出到另一个软件。我的导出excel绘图点和auto cad绘图点不重合。因此,请尝试将auto cad从4位精度缩放到2位精度,这些应与auto cad坐标匹配,导出的CSV点应相同。请在此帖子中找到帖子#1。
 
谢谢你,
顺致敬意,
页: [1]
查看完整版本: 尺寸和C的差异