找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1031|回复: 7

[LISP程序]:请教各位老师,rtos函数真的无法改变PL线的顶点坐标精度,请问还有办法吗

[复制链接]
发表于 2004-3-27 16:41:46 | 显示全部楼层 |阅读模式

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

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

×
老师:您好
    我刚才试过,在“(SetQ pel (EntGet pen));取出对象表” 中,取出的坐标已经被截去了第7位,只保留了小数点前的6位,而小数点后的3位被截去了,被变为了“.000”。
随后的操作如果再用rtos函数,也是无法实现取到小数点后第三位精度的。
    请您再帮我想想办法,我想保留小数点后3位有效数字,如:479740.506
    多谢各位老师!
    例如:PL线三个顶点坐标:(0 0),(479740.506 336635.034),(480140.078 336653.532);在取出这
这些坐标时,pel中X、Y坐标均为(479740.0 336635.0),(480140.0 336653.0);这时再用rtos函数,也无
法改变X、Y坐标的精度了。这是不是autocad自作主张的又一个例子呀?
    实际中,我们用到的大地坐标系,是小数点前面有6位,小数点后面有3位,就象例子中的一样。
   
您看我在程序的最后加了几行,使用了rtos函数,可是求出的X,Y坐标还真的没变,您帮我试试吧

[php]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun C:PLL2 ()
       (PrinC "\n这是对 PolyLine 进行数据分析的基本程序...")
       (While (Progn (SetQ pen (Car (EntSel "\n指定一条 PolyLine: ")))
                        (/= "POLYLINE" (Cdr (Assoc 0 (EntGet pen))))

)
                (Alert "所指对象不是 PolyLine,请重新指定...")
       )                                              ;指定PolyLine
       (SetQ pel (EntGet pen)           ;取出对象表
              ptp (Cdr (Assoc 70 pel))   ;取出结束片段型
              wpl '()                       ;自建的点位数表
           pen (EntNext pen)
       )
       (While (/= "SEQEND" (Cdr (Assoc 0 (EntGet pen)))) ;如果没结束
               (SetQ pel (EntGet pen)           ;取得顶点对象数据表
               plp (Cdr (Assoc 10 pel))    ;取出控制点点位
                      par (Cdr (Assoc 42 pel))     ;取出弓弦比
                      wpl (Cons (List plp par) wpl)    ;将数据加到WPL表中
               )
               (SetQ pen (EntNext pen))                ;搜索下一个对象
       )
       (SetQ ct (If (= 0 (Cadr (Car wpl))) "直线片段封闭" "弧片段封闭"))
       (SetQ wpl (Cons (Last wpl) wpl) ;加入封闭点
       wpl (Reverse wpl)           ;整理WPL表
       rl (Length wpl)
              pn 0
       )            
       (SetQ clk (If (Or (= 0 ptp) (= 128 ptp)) "开口" "封闭"))  
       (Repeat (1- rl)                 ;逐点分析
               (SetQ al (Nth pn wpl)  ;取出点数据表
                     pt (Car al)        ;取出点位
               )
               (Command ;"point" pt
                        "text" "m" pt 5 0 (StrCat "T" (IToA pn))
               )
               (SetQ pn (1+ pn)) ;搜索序号步进
       )
       (Alert (StrCat "结束段状态:\n"
                  clk
                        (If (= "封闭" clk) ct "")
              )
       )
       (PrinC)
  ;;;以上是陈伯雄老师原程序
  ;;;以下是我tywsc的新加程序以说明Rtos函数在这里真的无效
     (setq aa (nth 1 wpl))   
      (setq aaa (nth 0 aa))

     (setq aaax (nth 0 aaa))
     (setq aaay (nth 1 aaa))
     (setq aaaax (atof(rtos aaax 2 3)))
     (setq aaaay (atof(rtos aaay 2 3)))

     (PrinC aaaax)
     (PrinC "  ")
     (PrinC aaaay)
  )
[/php]

运行(c:pll2)后,!aaaaax,!aaaay;说明Rtos函数在这里真的无效。不知还有何办法啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-27 17:02:39 | 显示全部楼层

Re: [LISP程序]:请教各位老师,rtos函数真的无法改变PL线的顶点坐标精度,请问还有办法吗?

最初由 tywsc 发布
[B]老师:您好
    我刚才试过,在“(SetQ pel (EntGet pen));取出对象表” 中,取出的坐标已经被截去了第7位,只保留了小数点前的6位,而小数点后的3位被截去了,被变为了“.000”。
随后的操作如果再用rtos函数,?.. [/B]


  1.   ;;;以下是我tywsc的新加程序以说明Rtos函数在这里真的无效
  2.      (setq aa (nth 1 wpl))   
  3.       (setq aaa (nth 0 aa))

  4.      (setq aaax (nth 0 aaa))
  5.      (setq aaay (nth 1 aaa))
  6.      (setq aaaax (atof(rtos aaax 2 3)))
  7.      (setq aaaay (atof(rtos aaay 2 3)))

  8.      (PrinC aaaax)
  9.      (PrinC "  ")
  10.      (PrinC aaaay)


最后这段代码,aaax 是(nth 0 aaa),从上面的程序看,得到的应该是点,而RTOS要求参数是实数。你给的是点表参数,结果当然是NIL了。你应该在得到点表里面的X,Y,Z实数进行变换。你不应该只看RTOS结果不对,你应该监视下RTOS的参数AAAX值是否符合RTOS的要求。

另外,你要改变什么精度呢? 如果你要用,精度足够了,你再转换只能让精度变低而已。实际上得到的点表是足够精度的,只是显示的时候显示小数点后两位罢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-27 17:51:56 | 显示全部楼层
这种精度的误差充其量是用equal时加一个精度控制,正常使用足够精度了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-27 19:09:27 | 显示全部楼层

我运行的结果真的说明了cad内定了6位的限制

老师,您看我运行的结果:

command:  !wpl
(((123457.0 123457.0 0.0) 0.0) ((479940.0 336644.0 0.0) 0.0) ((525960.0 336644.0 0.0) 0.0) ((123457.0 123457.0 0.0) 0.0))
command: ! aa
((479940.0 336644.0 0.0) 0.0)
command:  !aaa
(479940.0 336644.0 0.0)
command:   aaax
479940.0
command:   !aaay
336644.0
command:   !aaaax
479940.0
command:   !aaaay
336644.0

而实际上其坐标应该为(479740.506 336635.034)
可见rtos函数根本没起作用。

实际上,我是想建立一个原始数据文件,为以后,别的程序算长度和桩号用。可如果其坐标精度不够,就很难成为有用的原始数据文件了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-27 20:38:32 | 显示全部楼层
差这么多?!已经不是精度问题,而是“错误”问题了。你的“应该”坐标是怎么得的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-28 00:10:58 | 显示全部楼层
(defun c:pld()
  (setq e(car (entsel ))
        pb(cy_pl-pb0 e))
)
(rtos (car (car pb)) 2 8)

"38627.85922923"

(rtos (car (car pb)) 2 16)

"38627.85922923160"

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

使用道具 举报

 楼主| 发表于 2004-3-28 00:20:03 | 显示全部楼层
例如:已知按照三个顶点坐标:(0 0),(479740.506 336635.034),(480140.078 336653.532)画出一条PL线,运行上面PLL2程序后,得到一些数据,

实际上我想得到如下的原始数据文件(11.txt):
(1 T1 0.0   0.0)
(2 T2 479740.506 336635.034)
(3 T3 480140.078 336653.532)
其中:第一列为序号,第二列为节点号,第三列为节点的X坐标,第四列为节点的Y坐标。

再随后的程序中,我想用上面的原始数据文件(11.txt)作为计算其它数据的依据,可
实际中11.txt文件中的X、Y坐标都被截取为6位了,变为:
(1 T1 0.0   0.0)
(2 T2 479740.0  336635.0)
(3 T3 480140.0  336653.0)
而别的程序,如果再调用上述数据文件,结果当然就不对了,因为数据文件中,小数后面
的数据被人为截掉了。

我的问题挺现实的:在程序运行时,实数只显示6位,而实际上可能存储着许多位(我印象
中,教科书里说是14位);但,一旦这些数据存入一个数据文件中,来供其它程序使用时,
那存入数据文件的那6位数的数据,就绝不会再变为7位8位或9位等。您说:我说的对吧。
    您说我该怎样写程序,使X、Y坐标在数据文件中就显示为9位实数呢?
多谢老师指教。
     5楼说的对,那已经不是精度问题,而是“错误”问题了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2004-3-28 21:22:27 | 显示全部楼层
我也遇到过这个问题,它在CAD中的精度是14位,当你在CAD中进行值的转赋时,它的精度是不会丢失的。
它只是在对坐标点表进行写入文本文件时,有问题,在我这儿它可以精确到小数点后四位,听说可以通过变量进行控制。但我没有找到!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 02:03 , Processed in 0.192877 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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