明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1543|回复: 2

[源码] 一个简化版本的图元坐标值圆整程序,源码奉献

[复制链接]
发表于 2014-10-19 13:17 | 显示全部楼层 |阅读模式
本帖最后由 vectra 于 2014-10-19 18:45 编辑

看到highflybir这个非常有创意的程序
[【高飞鸟】] 【飞鸟集】数据取整(更新至2012.6)http://bbs.mjtd.com/thread-86961-1-1.html

心想,符合CAD编程规则的图元,用作坐标的组码值是有一定要求的,所以应该可以用很简单统一的代码实现,于是有了下面这个版本的数据取整程序。理论上应该支持各种已知或未知的图元类型。

highflybir的代码没有深入地看,可能各自对基点和容差的理解、实现各不相同。

在我的版本里,圆整值的含义是:坐标各分量只能是圆整值的整数倍,和“标注舍入”的实现类似。当然,这个简化版本在可靠性和错误处理上要弱一点,而且我这里没有天正或其它有自定义实体的软件,因此也没有办法对自定义的实体进行测试,欢迎大家测试反馈。

  1. (vl-load-com)

  2. (setq *tolerance* 1)

  3. (defun ceiling (n tor)
  4.   (* (fix (+ 0.5 (/ n tor))) tor)
  5. )

  6. (defun c:fix (/ fixpointgroup fixdxf base dxf ent i offset len ss tor)
  7.   (defun fixpointgroup (p)
  8.     (mapcar '(lambda (e) (ceiling e *tolerance*)) (mapcar '+ offset p))
  9.   )

  10.   (defun fixdxf        (dxf)
  11.     ;; 见 DXF 参考 > DXF 格式 > 组码值类型。10-39 双精度三维点值
  12.     ;; 测试中发现部分 3x 组码并非点,安全起见仅处理 10-14 常用表示点的组码值
  13.     (setq dxf (mapcar '(lambda (e)
  14.                          (if (and (>= (car e) 10) (<= (car e) 14))
  15.                            (cons (car e) (fixpointgroup (cdr e)))
  16.                            e
  17.                          )
  18.                        )
  19.                       dxf
  20.               )
  21.     )
  22.     (entmod dxf)
  23.   )

  24.   (setq ss (ssget))
  25.   (if ss
  26.     (progn
  27.       (setq base (getpoint (strcat "\n指定修正基点:"))) ;_ 基点意在圆整坐标时最小化图元相对位置改变
  28.       (if (null base)
  29.         (vl-exit-with-value 1)
  30.       )

  31.       (initget 6)
  32.       (setq tor (getreal (strcat "\n请输入坐标圆整值: <" (rtos *tolerance* 2 3) ">")))
  33.       (if tor
  34.         (setq *tolerance* tor)
  35.       )

  36.       (setq offset (mapcar '- (mapcar '(lambda (e) (ceiling e *tolerance*)) base) base))

  37.       (setq len        (sslength ss)
  38.             i        0
  39.       )
  40.       (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))

  41.       (repeat len
  42.         (setq ent (ssname ss i)
  43.               dxf (entget ent)
  44.         )

  45.         (cond
  46.           ((= "POLYLINE" (cdr (assoc 0 dxf)))
  47.            (setq ent (entnext ent))
  48.            (while (/= (cdr (assoc 0 (setq dxf (entget ent)))) "SEQEND")
  49.              (fixdxf dxf)
  50.              (setq ent (entnext ent))
  51.            )
  52.           )

  53.           ;; TODO: 增加其它复合对象处理

  54.           ;; 其它类型实体均采用该方法处理
  55.           (t (fixdxf dxf))
  56.         )

  57.         (setq i (1+ i))
  58.       )

  59.       (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  60.     )
  61.   )
  62.   (princ)
  63. )

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-10-19 13:39 | 显示全部楼层
支持源码。
发表于 2014-10-20 07:57 | 显示全部楼层
支持楼主奉献源码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-6 04:07 , Processed in 0.201606 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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