明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2137|回复: 4

[原创][LISP]根据允许偏离距离DIST_MIN,处理LWPOLYLINE的凸度数据(弧段)

[复制链接]
发表于 2004-1-3 13:17:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2004-1-11 2:25:26 编辑

  1. 程序代码内容
  2. ;;;根据允许偏离距离DIST_MIN,处理LWPOLYLINE的凸度数据(弧段)。
  3. ;;;由凸度计算出弧段直径,再计算以允许偏离距离DIST_MIN为弓高的弧段弦长度LENGTH_XIAN_MAX
  4. ;;;再由弧长LENGTH_XIAN和最大弦LENGTH_XIAN_MAX计算要插入顶点数NUM_HU,然后插入顶点
  5. ;;;90项点数
  6. ;;;42弧段弓弦比=(/ 弓高 (/ 弦长 2.0))
  7. (DEFUN lwpolyline_remove42 (ss1          dist_min
  8.                             /            curve-obj
  9.                             data_new     diameter
  10.                             dist_min     dxfold_10
  11.                             dxfold_42    ename
  12.                             length_gong  length_hu
  13.                             length_hu_max
  14.                             length_start length_xian
  15.                             num1         num_hu
  16.                             point_add_num
  17.                             ss1          tmp
  18.                            )
  19.     ;;检查参数
  20.     (IF (NOT ss1)
  21.         (SETQ ss1 (SSADD))
  22.     )
  23.     (IF (OR (/= 'pickset (TYPE ss1)) (AND (/= 'real (TYPE dist_min)) (/= 'int (TYPE dist_min))))
  24.         (*error* "参数类型错。")
  25.     )
  26.     (PRINC (STRCAT "\n\t0\t处理含有凸度的LWPOLYLINE,共< " (ITOA (SSLENGTH ss1)) " >。"))
  27.     (SETQ num1 0)
  28.     (REPEAT (SSLENGTH ss1)
  29.         (SETQ ename         (SSNAME ss1 num1)
  30.               curve-obj     (VLAX-ENAME->VLA-OBJECT ename)
  31.               num1          (1+ num1)
  32.               data_new      (LIST)                ;更新后的数据
  33.               dxfold_10     nil                   ;上一个顶点坐标
  34.               point_add_num 0                     ;插入的顶点数
  35.         )
  36.         (PRINC (STRCAT "\r\t" (ITOA num1)))
  37.         (FOREACH data_one (ENTGET ename)
  38.             (COND ((= 10 (CAR data_one))
  39.                    (IF (AND dxfold_10 (/= dxfold_42 0.0)) ;如果是弧片断
  40.                        (PROGN ;;42弧段弓弦比=(/ 弓高 (/ 弦长 2.0))
  41.                               ;;直径=(/ (+ (* 弦长 弦长 0.25) (* 弓高 弓高) 弓高))
  42.                               (SETQ length_xian (DISTANCE (CDR data_one) dxfold_10) ;弦长
  43.                                     length_gong (ABS (* dxfold_42 length_xian 0.5)) ;弓高
  44.                                     diameter    (/ (+ (* length_xian length_xian 0.25) (* length_gong length_gong)) length_gong)
  45.                                                   ;直径
  46.                               )
  47.                               ;;反算最大弦长LENGTH_XIAN_MAX
  48.                               ;;弦长=(SQRT (* (- (* 直径 弓高) (* 弓高 弓高)) 4))
  49.                               ;;计算出分段数目NUM_HU
  50.                               (SETQ length_hu_max (SQRT (ABS (* (- (* diameter dist_min) (* dist_min dist_min)) 4)))
  51.                                     length_start  (VLAX-CURVE-GETDISTATPOINT curve-obj dxfold_10)
  52.                                     length_hu     (ABS (- (VLAX-CURVE-GETDISTATPOINT curve-obj (CDR data_one)) length_start))
  53.                               )
  54.                               (IF (< length_hu_max dist_min)
  55.                                   (SETQ num_hu 0)
  56.                                   (SETQ num_hu        (FIX (/ length_hu length_hu_max))
  57.                                         length_hu_max (/ length_hu (1+ num_hu))
  58.                                   )
  59.                               )
  60.                               ;;插入NUM_HU个顶点
  61.                               (REPEAT num_hu
  62.                                   (SETQ length_start  (+ length_start length_hu_max)
  63.                                         point_add_num (1+ point_add_num)
  64.                                   )
  65.                                   (IF (SETQ tmp (VLAX-CURVE-GETPOINTATDIST curve-obj length_start))
  66.                                       (SETQ data_new (APPEND data_new (LIST (CONS 10 (MAPCAR '* '(1 1) tmp)))))
  67.                                   )
  68.                               )
  69.                        )
  70.                    )
  71.                    (SETQ dxfold_10 (CDR data_one))
  72.                   )
  73.                   ((= 42 (CAR data_one))
  74.                    (SETQ dxfold_42 (CDR data_one)
  75.                          data_one  '(42 . 0.0)
  76.                    )
  77.                   )
  78.             )
  79.             (SETQ data_new (APPEND data_new (LIST data_one)))
  80.         )
  81.         ;;更新顶点数
  82.         (SETQ data_new (SUBST (CONS 90 (+ point_add_num (CDR (ASSOC '90 data_new)))) (ASSOC '90 data_new) data_new))
  83.         (IF (NOT (ENTMOD data_new))
  84.             (*error* "不能更新实体数据。")
  85.         )
  86.     )
  87.     (PRINC)
  88. )
  89. ;;;测试
  90. (DEFUN c:test ()
  91.     ;;根据允许偏离距离DIST_MIN,处理LWPOLYLINE的凸度数据
  92.     (WHILE (SETQ tmp (SSGET "X" '((0 . "LWPOLYLINE") (-4 . "/=") (42 . 0.0))))
  93.         (lwpolyline_remove42 tmp 0.05)
  94.     )
  95.     (PRINC)
  96. )
  97. (PRINC)
复制代码
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2004-1-3 20:19:00 | 显示全部楼层
人家简化还来不及,你却要加点。不知道你用在什么方面?
 楼主| 发表于 2004-1-4 01:46:00 | 显示全部楼层
输出为外部文件,转换成不支持ARC的系统。
我是为了输出成e00文件进行处理的。
发表于 2004-1-10 15:57:00 | 显示全部楼层
本帖最后由 作者 于 2004-1-10 17:40:46 编辑

;;;gg  -->原来的凸度
(setq ang (* 4 (atan (abs gg))) ;;;-->这弧线的包含角
;;;dist_min -->你给的允许偏离距离:新凸度
(setq ang_new(* 4 (atan (abs dist_min))) ;;;-->新角度
那么新弧线长为:
(setq new_hu_len(* old_hu_len(/ ang_new ang))) ;;;old_hu_len求应该很方便,就是你的"length_hu"

现在关键是你的dist_min 是根据什么来的.
能不能讲讲
 楼主| 发表于 2004-1-11 02:22:00 | 显示全部楼层
我是用来把大比例尺地形图的线输出成E00文件的。方案中有限差,最大不能超过图中距离0.1毫米,DWG数据用的是实地坐标,比例尺.1:1000。就是说不可以超出0.1。实际上为了保险起见,我把它调到0.05了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 12:46 , Processed in 0.182703 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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