明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1485|回复: 12

[提问] 我写的这个命令有点蹊跷,求测试

[复制链接]
发表于 2018-6-27 18:37:11 | 显示全部楼层 |阅读模式
写了个根据四参数转换坐标并更新对象坐标列表的命令,现在碰到了个奇怪的问题:
1、获取一条多段线的坐标列表,然后用坐标转换子函数得出的坐标
2、直接在坐标转换子函数中定义和多段线端点坐标一致的坐标计算得出的坐标
1和2得出的结果不一致
 楼主| 发表于 2018-6-27 18:38:15 | 显示全部楼层
  1. (defun zbzh (ppt_x ppt_y)
  2.   (setq d_x -15.0
  3.         d_y -3.0
  4.         k_k 1.0056046755
  5.         a_angle 0.0005081
  6.         )
  7.   (setq dd_x (+ d_x (* k_k (- (* (cos a_angle) ppt_x)  (* (sin a_angle) ppt_y)))))
  8.   (setq dd_y (+ d_y (* k_k (+ (* (cos a_angle) ppt_y)  (* (sin a_angle) ppt_x)))))
  9.   (setq ppt (list dd_x dd_y))

  10.   )

  11. (defun c:zh (/               ss         l_length  data             new_list
  12.              last_list m_list         en           en_data   b_list
  13.              pt               pt_x         pt_y           pt_h             new_pt_x
  14.              new_pt_y  new_pt         pt_data   data             f_list
  15.              new_en_data
  16.             )
  17.   (setvar "nomutt" 1)
  18.   (setq ss (ssget '((0 . "LWPOLYLINE")))) ;选择多个对象
  19.   (setvar "nomutt" 0)
  20.   (setq l_length 0)
  21.   (repeat (sslength ss)
  22.     (setq i            0
  23.           j            0
  24.           n            0
  25.           z            0
  26.           m            0
  27.           mm            0
  28.           data            (list '(0 0))
  29.           new_list  (list '(0 0))
  30.           last_list (list '(0 0))
  31.           m_list    (list '(0 0))
  32.     )
  33.     (setq en (ssname ss l_length))        ;获取第“l_length”个对象的对象名
  34.     (setq en_data (entget en))                ;获取对象列表
  35.     (setq b_list (list (car (reverse en_data))))
  36.     (while (/= (nth j en_data) nil)
  37.       (if (= (car (nth j en_data)) 10)
  38.         (progn
  39.           (setq pt (cdr (nth j en_data)))
  40.           (setq pt_x (car pt))
  41.           (setq pt_xx (distof (rtos pt_x 2 10)))
  42.           (setq pt_y (cadr pt))
  43.           (setq pt_yy (atof (rtos pt_y 2 10)))
  44.           (setq pt_h (caddr pt))
  45.           (if (= pt_h nil)
  46.             (setq pt_h 0)
  47.           )
  48.           (setq new_pt_x (car(zbzh pt_x pt_y)))
  49.           (setq new_pt_x (atof (rtos new_pt_x 2 12)))
  50.           (setq new_pt_y (cadr (zbzh pt_x pt_y)))
  51.           (setq new_pt_y (atof (rtos new_pt_y 2 12)))
  52.           (setq new_pt (list new_pt_x new_pt_y pt_h))
  53.           (setq pt_data (cons 10 new_pt))
  54.           (setq        data (append (list (list pt_data
  55.                                          (nth (+ j 1) en_data)
  56.                                          (nth (+ j 2) en_data)
  57.                                          (nth (+ j 3) en_data)
  58.                                    )
  59.                              )
  60.                              data
  61.                      )
  62.           )
  63.           (setq z (+ z 1))
  64.           (if (= z 1)
  65.             (setq f_list (carnth j en_data))
  66.                                         ;获取对象数据中第一个节点坐标前的列表数据
  67.           )                                ;end if
  68.         )                                ;end progn
  69.       )                                        ;end if
  70.       (setq j (+ j 1))
  71.     )
  72.     (setq data (cdr (reverse data)))

  73.     (while (/= (nth mm data) nil)
  74.       (setq nn 0)
  75.       (while (/= (nth nn (nth mm data)) nil)
  76.         (setq m_list
  77.                (append (list (nth nn (nth mm data))) m_list)
  78.         )
  79.         (setq nn (+ nn 1))
  80.       )                                        ;end while
  81.       (setq mm (+ mm 1))
  82.     )
  83.     (setq m_list (cdr (reverse m_list)))

  84. ;;;对象更新
  85.     (setq new_en_data (append f_list m_list b_list))


  86.     (entmod new_en_data)
  87.     (setq l_length (+ l_length 1))
  88.   )
  89. )

这是1中所用的命令

点评

建议把四参数和待转换的坐标点均作为zbzh的参数 四参数在主程序中通过对话框获取,然后和待转换的坐标点p一起传给zbzh函数来处理  发表于 2018-7-2 23:57
 楼主| 发表于 2018-6-27 18:41:10 | 显示全部楼层
  1. (defun c:test1()

  2.   (setq d_x -15.0
  3.         d_y -3.0
  4.         k_k 1.0056046755
  5.         a_angle 0.0005081
  6.         pt_x 2753748.277
  7.         pt_y 511748.461
  8.         )
  9.   (setq dd_x (+ d_x (* k_k (- (* (cos a_angle) pt_x)  (* (sin a_angle) pt_y)))))
  10.   (setq dd_y (+ d_y (* k_k (+ (* (cos a_angle) pt_y)  (* (sin a_angle) pt_x)))))
  11.   (setq dd_x (rtos dd_x 2 3))
  12.   (setq dd_y (rtos dd_y 2 3))
  13.   (princ dd_x )
  14.   (princ dd_y)
  15.   )

在这个函数中直接定义和多段线端点一致的坐标 pt_x  pt_y,这两种计算得出的结果不一样。求解惑
 楼主| 发表于 2018-6-28 20:54:00 | 显示全部楼层
xinxirong 发表于 2018-6-28 18:37
静下心来,一步一步调试。没有人比你更强大

谢谢鼓励,真心是调试了一整天了,都在获取节点坐标带到子函数内计算时就和直接定义坐标值带入计算出现差异。不然我也不会发帖求助的
发表于 2018-6-28 18:37:27 来自手机 | 显示全部楼层
静下心来,一步一步调试。没有人比你更强大
发表于 2018-6-28 19:20:20 来自手机 | 显示全部楼层
如此多的+-×,看得我入目三分,实在爱莫难助
 楼主| 发表于 2018-6-28 20:54:40 | 显示全部楼层
evayleung 发表于 2018-6-28 19:20
如此多的+-×,看得我入目三分,实在爱莫难助

不好意思,水平有限,简单粗暴了
 楼主| 发表于 2018-7-2 09:24:02 | 显示全部楼层
最后自顶一次
发表于 2018-7-2 09:33:53 | 显示全部楼层

是不是因为,你定义的是三位小数,而实际坐标和你定义的有点差距啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-19 10:38 , Processed in 0.188891 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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