找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 507|回复: 8

[求助] 求助:如何保证坐标精度

[复制链接]
发表于 2017-8-6 08:51:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
在读出的图元表中只有5位有效数字,应如何设置,保证坐标有小数点后有3位数字
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-6 09:13:49 | 显示全部楼层
再有问题,把你的代码贴上来,别人才会告诉你怎么改。

你说的太朦胧了。

尺寸,文本都有不同的控制。

如果你要想转成文本,精度用函数 RTOS

(rtos txt 2 3)  --- 小数保留3位
(rtos txt 2 5)  --- 小数保留5位
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-6 10:09:29 | 显示全部楼层
我想读取图元表,然后按图元表中的(10 466353.0 3.21342e+006 0.0) 坐标值进行坐标变换:
在读取图元表时设置参数,使得坐标466353.0 3.21342e+006 0.0有3位小数值
((-1 . <图元名: 7ecbf838>) (0 . "INSERT") (330 . <图元名: 7ecc1c10>) (5 . "18E7") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "GXYZ") (6 . "Continuous") (100 . "AcDbBlockReference") (2 . "gc013c") (10 466353.0 3.21342e+006 0.0) (41 . 0.5) (42 . 0.5) (43 . 1.0) (50 . 3.85583) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-6 10:25:59 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-6 10:31:49 | 显示全部楼层
(defun dxt_transform (layer_name)
  (setq ll (length layer_name))
  (print ll)
  (print layer_name)
;;layer_name==图层名变量    ( ll:层数,i:图层序数)
  ;(print "jjjjjjjj")
  (setq i 0)
  (repeat ll
     (setq name (nth i layer_name))
     (print (strcat "图层名--》" name))
     (setq ss (ssget "X" (list (cons 8 name))))
     (setq len (sslength ss))
  ;;依次读出并打印每个坐标点(符号块为一个点、polyline为多个点
  ;;len:每层图元数,k:图元序数
     (setq k 0)
     (repeat len
        (setq enl (ssname ss k))
        (setq enl_data(entget enl))

       (print enl_data)
    ;;依次提取坐标并处理
    ;;采用处理方法:为10时处理坐标后插入,否则直接插入||先选第一个为new_data
        (setq n 0)
        (setq data_len(length enl_data))
        (setq data_len(- data_len 1))
        (setq l(+ data_len 10))
        (setq new_data (nth 0 enl_data))
        (setq n1 (nth 1 enl_data))
        ;(print n1)
       ;;处理坐标,先取图元类型,在按图元类型分别处理
        (setq type_lx(cdr (assoc 0 enl_data)))
        (print type_lx)
        (print data_len)
        ;分支开始
        (if (member type_lx '("LINE" "LWPOLYLINE" "MLINE"))
            (progn
              (print "在===》多点坐标")
              ;;获取坐标点列表  nn:图元表列表数  n:列表序数
              ;(print enl_data)
              (setq nn(length enl_data))
              ;;获取图层8、线型6、线颜色62、线宽370、多义线标志70等数据
              ;;
              (setq line_layer(cdr (assoc 8 enl_data)))
              (setq line_color(cdr (assoc 62 enl_data)))
              (print "颜色")
              (print line_color)
              (if(= nil line_color) (setq line_color 0))
              (setq line_type(cdr (assoc 6 enl_data)))
              (setq line_kd(cdr (assoc 370 enl_data)))
              (setq line_43(cdr (assoc 43 enl_data)))
              (if(= nil line_kd) (setq line_kd 10))
              (setq line_bz(cdr (assoc 70 enl_data)))
              ;(print "颜色")
              ;(print line_color)
                    
              ;;先设置一个表xy
              (setq xy(list (list 0 0)))
              (repeat nn
                (setq pp (nth n enl_data))
                (setq key (car pp))
                 
                (if (= key 10)
                       (progn
                   (setq x  ((rtos (cadr pp) 2 4)))
                   (setq xx (atof x))
                   (print "ooooooo")
                   (setq y (caddr pp))          
                   
                   ;;对坐标进行变换
                   (setq x1(+ x 10))
                   (setq y1(+ y 10))

                  
                   ;;组成点表
                   (setq x_y(list (list x1 y1)))
                   (setq xy(list:add xy x_y ))
                  
                  
                  )
              )
              (setq n(+ n 1))  ;点
                  
          )
          ;;组织多义线、删除第一个元素(0 0 )
          (setq fst '((0  0)))
          (setq xy(List:remove fst xy))
          ;;按直线或多义线分别成图
          (if (= (cdr (assoc 0 enl_data)) "LINE")
            (progn
                ;(print "-----------")
                ;(print xy)
                (setq pt(cdr (assoc 11 enl_data)))
                
                (setq xx(nth 0 pt))
                (setq yy(nth 1 pt))
                ;;第二点坐标变换
                (setq xx(+ xx 10.201))
                (setq yy(+ yy 10))
                ;;(setq pt2(list xx yy))
                ;;(print pt2)
                     
                ;;(setq pt1(nth 0 xy))
                ;;(print pt1)
                ;;用修改过的坐标替换原来坐标后变换10 起点 11 终点
                ;;
                (setq enl_data (subst (list 10 x1 y1 0)(assoc 10 enl_data)enl_data))
                (setq enl_data (subst (list 11 xx yy 0)(assoc 11 enl_data)enl_data))
                (entmod enl_data)
                (princ)
              )
            (progn
                (print "多义线") (print xy)
                ;;删除原图元
                (setq a(cdr (assoc -1 enl_data)))
                (command "erase" a "")
                (mkpolyline line_layer line_color line_type  line_kd line_43 line_bz xy )
                (princ)
               
              )
            )
          
         )


         
              ;;多点坐标处理结束



            
            (progn
              (print "在===》单点坐标")
               ;;单点坐标只有一个坐标值,只要提取坐标变换后更新到原来的图元表即可
              (setq xy (cdr (assoc 10 enl_data)))
              ;(print xy)
              (setq x(nth 0 xy))
              (setq y(nth 1 xy))
              ;;变换坐标
              (setq x1(+ x 10))
              (setq y1(+ y 10))
              (setq x_y(list x1 y1 0))
              ;(print x_y)
              (setq enl_data (subst (list 10 x1 y1 0)(assoc 10 enl_data)enl_data))
              (entmod enl_data)
              (princ)

              )
          )

       ;;坐标处理结束
        (setq k(+ k 1))
      )
    (setq i (+ i 1))
    (print i)
   )

)

;;组码370与码43的关系
;如果使用370 则图形不显示,如使用43则无法转换原来的线宽。
;颜色如果为Bylayer,则转换后为Byblock,全为白色,
;如原来颜色设置为Byblock,线宽设置为具体的,则能全部转换


;;构造多点坐标的图元:line、LWPOLYLINE
;构造点对:(setq h 70)   (setq a(cons 370 h)
;结果:(370 . 70)

(defun mkline (line_layer  line_color line_type line_kd p1 p2)
   (if (setq ent (entmakex (list '(0 . "LINE")
                                 '(100 . "AcDbEntity")
                                  (cons 8 line_layer)
                                  (cons 62 line_color)
                                  (cons 6 line_type)
                                  (cons 43 (/ line_kd 100))
                                  (cons 370 line_kd)
                                 '(100 . "AcDbLine")
                                  (cons 10 p1)
                                   (cons 11 p2)
                                 '(210 0. 0. 1.)
                          )
                )
      )
    ent
  )
)
;;;

;;Entmake点表生成多段线
(defun mkpolyline (line_layer line_color line_type  line_kd line_43 line_bz p_lst / pt)
  (print line_kd)
  
  (entmakeX
    (append
      (list '(0 . "LWPOLYLINE")
     '(100 . "AcDbEntity")
      (cons 8 line_layer)
      (cons 62 line_color)
      (cons 6 line_type)
      ;(cons 370 line_kd)
      (cons 43 line_43)
     '(100 . "AcDbPolyline")
      (cons 90 (length p_lst))
      (cons 70 line_bz)
      )
      (mapcar '(lambda (pt) (cons 10 pt)) p_lst)
      
    )
  )
)

;;;
;|
   转换表APPEND为CONS
   参数:
     LST1---表
     LST2---表

   返回值:表
;;组成点表(setq y(cons 1 2))===> (1 . 2)
|;;组成表(setq y(list 1 2))===>(1 2)
;;(setq x(list (list 1 2)))==>((1 2))
;;(setq y(list (list 3 4)))==>((3 4)) (XD::List:Append x y)==>((1 2) (3 4))
(defun List:add (lst1 lst2)
  (mapcar
    '(lambda (x)
       (setq lst2 (cons x lst2))
     )
    (reverse lst1)
  )
  lst2
)


;;删除表中指定元素
;; expr==元素,lst==表
;; (List:remove ssg1 ssg)
;;(setq1 ssg1'((15 20 0)))
;;(setq ssg '((5 10) (15 20 0) (25 30) (35 40)))  (list:remove ssg1 ssg)
;;                    ==>((5 10) (25 30) (35 40)))
(defun remove (expr lst)
  (apply 'append (subst nil (list expr) (mapcar 'list lst)))
)

(defun List:remove (ssg1 ssg)
  (foreach p ssg1
    (setq ssg (remove p ssg))
  )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-8-6 10:42:05 | 显示全部楼层

你看到的都是ACAD给你简化的,ENTGET数据表10点,都是有足够的精度的,只是显示的问题
你可以测试下

  1. (defun c:tt ()
  2.   (defun _princ        (bit)
  3.     (princ (strcat "\n第一个顶点坐标值(保留" (itoa bit) "位):"))
  4.     (mapcar '(lambda (x)
  5.                (princ (rtos x 2 bit))
  6.                (princ ",")
  7.              )
  8.             p10
  9.     )
  10.     (princ)
  11.   )
  12.   (princ "\n选取多段线:")
  13.   (if (setq ss (ssget ":N:E" '((0 . "LWPOLYLINE"))))
  14.     (progn
  15.       (setq e        (ssname ss 0)
  16.             ed        (entget e)
  17.             p10        (cdr (assoc 10 ed))
  18.       )
  19.       (setvar "dimzin" 0)
  20.       (_princ 2)
  21.       (_princ 3)
  22.       (_princ 4)
  23.       (_princ 5)
  24.     )
  25.   )
  26.   (princ)
  27. )



选择对象:

第一个顶点坐标值(保留2位):2550.95,-935.90,
第一个顶点坐标值(保留3位):2550.947,-935.896,
第一个顶点坐标值(保留4位):2550.9470,-935.8961,
第一个顶点坐标值(保留5位):2550.94701,-935.89608,

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-8-6 10:42:37 | 显示全部楼层
本帖最后由 st788796 于 2017-8-6 10:50 编辑

A real is a number containing a decimal point. Numbers between -1 and 1 must contain a leading zero. Real numbers are stored in double-precision floating-point format, providing at least 14 significant digits of precision. Note that VLISP does not show you all the significant digits.

Reals can be expressed in scientific notation, which has an optional e or E followed by the exponent of the number (for example, 0.0000041 is the same as 4.1e-6). Numbers such as 3.1, 0.23, -56.123, and 21,000,000.0 are valid AutoLISP reals.

Autocad 中使用的是双精度浮点型,至少提供了14个有效位位数,Autolisp并不显示你所有有意义的数字,但是 UNITS 命令最大可以设置显示小数点后 8 位,这也只是显示,不表示截断了后面六位。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-8-6 10:48:25 | 显示全部楼层
本帖最后由 Lisphk 于 2017-8-6 10:49 编辑
(10 466353.0 3.21342e+006 0.0)

你看到的是466353.0,其实数据定义里面是足够精度的,这只是显示而已。


  1. (mapcar '(lambda(x)(rtos x 2 bit)) pt)

AUTOCAD的浮点数不存在你说的精度的问题,只是我们用的时候怎么取舍近似的。

上面的 bit 是显示的位数,pt是点, 你测试下不同的bit,看看值都是什么。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-6 12:11:43 | 显示全部楼层
谢谢大侠!明白了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-12 09:44 , Processed in 0.411604 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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