找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1766|回复: 5

[每日一码] 来点实用的,求spline线的最小包容盒子

[复制链接]

已领礼包: 146个

财富等级: 日进斗金

发表于 2014-8-12 19:11:36 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 lgx9612 于 2014-8-12 19:14 编辑

           来点实用的,求spline线的最小包容盒子,通常vla-getboundingbox来做spline线的最小包容盒子是会出错的,就如附图的cad曲线用vla-getboundingbox就错了.
  1. (defun c:test(/ cm_lgx ucs_lgx os_lgx ss_lgx llpoint)
  2. ;;;by:  刘国新
  3. (setq cm_lgx (getvar "cmdecho"))
  4. (setvar "cmdecho" 0)
  5. (setq ucs_lgx (getvar "ucsorg"))
  6. (command "ucs" "w")
  7. (setq os_lgx (getvar "osmode"))
  8. (setvar "osmode" 0)  
  9. (setq ss_lgx (car (entsel "请选择spline曲线")))
  10. (setq llpoint (calspline_lgx ss_lgx))
  11. (command "rectang" (car llpoint) (cadr llpoint))
  12. (setvar "osmode" os_lgx)
  13. (command "ucs" "n" ucs_lgx)
  14. (setvar "cmdecho" cm_lgx)
  15. )

  16. (defun calspline_lgx (partname_lgx / pl-temp_min_point pl-temp_max_point p_lgx
  17.          lowest bbb p1_lgx p_lgx vla-object zzl givenPnt type_lgx
  18.          y2 y1 x1 x2 llpoint urpoint pl_min_point pl_max_point)
  19. ;;;原创,编写:  刘国新
  20. ;;;精密计算spline线的最小包容盒子
  21. (setq bbb (entget partname_lgx))
  22. (while (/= (assoc 10  bbb) nil)
  23. (setq p1_lgx (assoc 10  bbb))
  24. (setq p_lgx (cons (cdr p1_lgx) p_lgx))
  25. (setq bbb (vl-remove p1_lgx bbb))
  26. )
  27. (setq pl-temp_min_point (apply 'mapcar (cons 'min p_lgx)))
  28. (setq pl-temp_max_point (apply 'mapcar (cons 'max p_lgx)))
  29. (setq pl-temp_min_point (list (- (car pl-temp_min_point) 3)(- (cadr pl-temp_min_point) 3)))
  30. (setq pl-temp_max_point (list (+ (car pl-temp_max_point) 3)(+ (cadr pl-temp_max_point) 3)))
  31. (setq vla-object(vlax-ename->vla-object partname_lgx))
  32. (progn
  33. (setq pl_min_point pl-temp_min_point)
  34. (setq pl_max_point pl-temp_max_point)
  35. (setq zzl (/ (- (car pl_max_point)(car pl_min_point)) 10))
  36. (setq  givenPnt (list (car pl_min_point)(cadr pl_max_point)))
  37. (setq y2 (calculate_lgx vla-object givenPnt "y" zzl pl_min_point pl_max_point))
  38. )
  39. (progn
  40. (setq pl_min_point pl-temp_min_point)
  41. (setq pl_max_point (list (car pl-temp_max_point)(cadr pl-temp_min_point)))
  42. (setq zzl (/ (- (car pl_max_point)(car pl_min_point)) 10))
  43. (setq  givenPnt (list (car pl_min_point)(cadr pl_max_point)))
  44. (setq y1 (calculate_lgx vla-object givenPnt "y" zzl pl_min_point pl_max_point))
  45. )
  46. (progn
  47. (setq pl_min_point pl-temp_min_point)
  48. (setq pl_max_point (list (car pl-temp_min_point)(cadr pl-temp_max_point)))
  49. (setq zzl (/ (- (cadr pl_max_point)(cadr pl_min_point)) 10))
  50. (setq  givenPnt pl_min_point)
  51. (setq x1 (calculate_lgx vla-object givenPnt "x" zzl pl_min_point pl_max_point))
  52. )
  53. (progn
  54. (setq pl_min_point (list (car pl-temp_max_point)(cadr pl-temp_min_point)))
  55. (setq pl_max_point pl-temp_max_point)
  56. (setq zzl (/ (- (cadr pl_max_point)(cadr pl_min_point)) 10))
  57. (setq  givenPnt pl_min_point)
  58. (setq x2 (calculate_lgx vla-object givenPnt "x" zzl pl_min_point pl_max_point))
  59. )
  60. (setq llpoint (list (car x1) (cadr y1)))
  61. (setq urpoint (list (car x2) (cadr y2)))
  62. (setq llpoint (list llpoint urpoint))
  63. llpoint
  64. )
  65. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  66. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  67. (defun calculate_lgx(vla-object givenPnt type_lgx zzl pl_min_point pl_max_point /  topnt lowest lowestpoint )
  68. ;;;原创,编写:  刘国新
  69. ;;;分四边精密求出最小包容盒子
  70. (while (>= zzl 0.02)
  71. (repeat 11
  72. (setq topnt (vlax-curve-getClosestPointTo vla-object givenPnt))
  73. ;;;(command "line" givenPnt topnt "")
  74. (if (or (>= lowest (distance  givenPnt topnt)) (= lowest nil))
  75. (progn
  76. (setq lowest (distance  givenPnt topnt))
  77. (setq lowestpoint givenPnt)
  78. )
  79. )
  80. (if (= type_lgx "y")
  81. (setq  givenPnt (list (+ (car givenPnt) zzl)(cadr pl_max_point)))
  82. (setq  givenPnt (list (car pl_min_point)(+ (cadr givenPnt) zzl)))
  83. )
  84. )
  85. (if (= type_lgx "y")  
  86. (setq  givenPnt (list (- (car lowestpoint) zzl) (cadr pl_max_point)))
  87. (setq  givenPnt (list (car pl_min_point)  (- (cadr lowestpoint) zzl)))
  88. )
  89. (setq zzl (/ zzl 5))
  90. )
  91. (setq topnt (vlax-curve-getClosestPointTo vla-object lowestpoint ))
  92. topnt
  93. )


lgx.gif

dwg.rar

6.02 KB, 下载次数: 21, 下载积分: D豆 -1 , 活跃度 1

演示用的cad图档

评分

参与人数 3D豆 +16 收起 理由
炫翔 + 5 很给力!经验;技术要点;资料分享奖!
XDSoft + 6 很给力!经验;技术要点;资料分享奖!
lucas3 + 5 刘工不是在明经发过吗?还没有解决?

查看全部评分

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

已领礼包: 146个

财富等级: 日进斗金

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

使用道具 举报

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

使用道具 举报

已领礼包: 2026个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

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

使用道具 举报

已领礼包: 756个

财富等级: 财运亨通

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-25 13:39 , Processed in 0.184349 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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