找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4207|回复: 15

[点表] 点表沿着曲线实体或者另外一个点表组成的多段线排序

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-13 20:37:38 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Pnts:SortOnCruve
调用格式: (XD::Pnts:SortOnCruve pts e)
参数说明: 参数:
PTS----待排序的点表
E------- 曲线实体或者点表
返回值:
函数简介: 点表沿着曲线实体或者另外一个点表组成的多段线排序
函数来源: 原创
函数作者: Lispboy
适用版本: 不限 
最后更新时间: 2013-06-13
备注: 如果参数E给点表,则对由这些点表组成的多段线线排序,如果给两点表,则构造XLINE排序。
演示图片: -

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

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

×
[sell=20]
  1. (defun XD::Pnts:SortOnCruve (pts e / acaddocument acadobject e1 mspace  obj objname x y)
  2.   (vl-load-com)
  3.   (defun AddPline (space lst / x)

  4.     (if (> (length lst) 2)
  5.        (vlax-invoke space  'AddLightWeightPolyline (apply
  6.                                                  'append
  7.                                                  (mapcar
  8.                                                    '(lambda (x)
  9.                                                       (list (float (car x)) ; _此处应为Double, INT会Fail
  10.                                                             (float (cadr x))
  11.                                                       )
  12.                                                     )
  13.                                                    lst
  14.                                                  )
  15.                                                )
  16.         )
  17.         (progn
  18.           (vla-AddXLine space (vlax-3d-point (car lst))(vlax-3d-point (cadr lst)))
  19.         )
  20.     )
  21.   )
  22.   (cond
  23.     ((and
  24.        (= (type e) 'ENAME)
  25.        (setq objname (cdr (assoc 0 (entget e))))
  26.        (wcmatch (strcase objname) "*LINE,*CIRCLE,*ARC,*ELLIPSE")
  27.      )
  28.       (setq pts1 (mapcar
  29.                    'cdr
  30.                    (vl-sort (mapcar
  31.                               '(lambda (x)
  32.                                  (cons (vlax-curve-getParamAtPoint e (vlax-curve-getClosestPointTo e x t)) x)
  33.                                )
  34.                               pts
  35.                             ) '(lambda (x y)
  36.                                  (< (car x) (car y))
  37.                                )
  38.                    )
  39.                  )
  40.       )
  41.     )
  42.     ((and (= (type e) 'LIST)
  43.           (> (length e) 1)
  44.      )
  45.       (setq AcadObject (vlax-get-acad-object)
  46.             AcadDocument (vla-get-ActiveDocument AcadObject)
  47.             mSpace (vla-get-ModelSpace AcadDocument)
  48.       )
  49.       (addpline mspace e)
  50.       (vlax-release-object mSpace)
  51.       (vlax-release-object AcadDocument)
  52.       (vlax-release-object AcadObject)
  53.       (setq e1 (entlast))
  54.       (setq pts1 (Pnts-Sort-Cruve pts e1))
  55.       (entdel e1)
  56.     )
  57.   )
  58.   pts1
  59. )

[/sell]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-13 20:41:36 | 显示全部楼层
本帖最后由 QiaoCheng 于 2013-6-13 20:45 编辑

咋要20豆?是不是和之前的那个函数一样啊?

点评

一样,整理下名字,如果不收豆,对不起那边付费的朋友了。你要下载了,就别下了。  详情 回复 发表于 2013-6-13 20:48
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-13 20:48:32 | 显示全部楼层
QiaoCheng 发表于 2013-6-13 20:41
咋要20豆?是不是和之前的那个函数一样啊?

一样,整理下名字,如果不收豆,对不起那边付费的朋友了。你要下载了,就别下了。

点评

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

使用道具 举报

发表于 2013-6-13 20:50:37 | 显示全部楼层
Lispboy 发表于 2013-6-13 20:48
一样,整理下名字,如果不收豆,对不起那边付费的朋友了。你要下载了,就别下了。

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-30 13:10:02 | 显示全部楼层
写个借用 Ge 实体的方法
  1. (defun XD::Pnts:SortOnCurve (pts e func / curve)
  2.   (cond
  3.     ((and (eq (type e) 'ENAME)
  4.           (= (xdrx_getpropertyvalue e "MyParent") "AcDbCurve")
  5.      )
  6.      (vl-sort pts
  7.               '(lambda (x1 x2)
  8.                  (apply        func
  9.                         (list (xdrx_curve_getparamatpoint e x1)
  10.                               (xdrx_curve_getparamatpoint e x2)
  11.                         )
  12.                  )
  13.                )
  14.      )
  15.     )
  16.     ((listp e)
  17.      (if (= (length e) 2)
  18.        (setq curve (xdge::constructor "kLine3d" (car e) (cadr e)))
  19.        (setq curve (xdge::constructor "kPolyline3d" e))
  20.      )
  21.      (setq pts (vl-sort
  22.                  pts
  23.                  '(lambda (x1 x2)
  24.                     (apply
  25.                       func
  26.                       (list
  27.                         (xdge::getpropertyvalue
  28.                           curve
  29.                           "paramOf"
  30.                           (xdge::getpropertyvalue
  31.                             (xdge::getpropertyvalue
  32.                               curve
  33.                               "getClosestPointTo"
  34.                               x1
  35.                             )
  36.                             "Point"
  37.                           )
  38.                         )
  39.                         (xdge::getpropertyvalue
  40.                           curve
  41.                           "paramOf"
  42.                           (xdge::getpropertyvalue
  43.                             (xdge::getpropertyvalue
  44.                               curve
  45.                               "getClosestPointTo"
  46.                               x2
  47.                             )
  48.                             "Point"
  49.                           )
  50.                         )
  51.                       )
  52.                     )
  53.                   )
  54.                )
  55.      )
  56.      (xdge::free)
  57.      pts
  58.     )
  59.     (t pts)
  60.   )
  61. )

点评

FUNC 参数怎么用?  详情 回复 发表于 2014-11-30 13:43
建议,xdrx_free 还是后面跟着参数,只释放本函数内创建的GE实体,因为如果全部释放了,可能造成函数外面的应用出错(万一外面也用GE了,就都给释放了)。  详情 回复 发表于 2014-11-30 13:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-30 13:42:14 | 显示全部楼层
st788796 发表于 2014-11-30 13:10
写个借用 Ge 实体的方法

建议,xdrx_free 还是后面跟着参数,只释放本函数内创建的GE实体,因为如果全部释放了,可能造成函数外面的应用出错(万一外面也用GE了,就都给释放了)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-30 13:43:34 | 显示全部楼层
st788796 发表于 2014-11-30 13:10
写个借用 Ge 实体的方法

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-30 23:00:21 | 显示全部楼层
newer 发表于 2014-11-30 13:43
FUNC 参数怎么用?

func 正向排 '< , 反向排 ‘>
上面写法生成太多的 kPointOnCurve,修改如下
  1. (defun XD::Pnts:SortOnCurve (pts e func / curve npts)
  2.   (cond
  3.     ((and (eq (type e) 'ENAME)
  4.           (= (xdrx_getpropertyvalue e "MyParent") "AcDbCurve")
  5.      )
  6.      (vl-sort pts
  7.               '(lambda (x1 x2)
  8.                  (apply        func
  9.                         (list (xdrx_curve_getparamatpoint e x1)
  10.                               (xdrx_curve_getparamatpoint e x2)
  11.                         )
  12.                  )
  13.                )
  14.      )
  15.     )
  16.     ((listp e)
  17.      (if (= (length e) 2)
  18.        (setq curve (xdge::constructor "kLine3d" (car e) (cadr e)))
  19.        (setq curve (xdge::constructor "kPolyline3d" e))
  20.      )
  21.      (setq npts
  22.             (mapcar '(lambda (x / gp pam)
  23.                        (setq gp         (xdge::getpropertyvalue
  24.                                    curve
  25.                                    "getClosestPointTo"
  26.                                    x
  27.                                  )
  28.                              pam (xdge::getpropertyvalue gp "parameter")
  29.                        )
  30.                        (xdge::free gp);_即时释放
  31.                        (list pam x)
  32.                      )
  33.                     pts
  34.             )
  35.      )
  36.      (xdge::free curve)
  37.      (mapcar 'cadr
  38.              (vl-sort npts
  39.                       '(lambda (x1 x2)
  40.                          (apply func (list (car x1) (car x2)))
  41.                        )
  42.              )
  43.      )
  44.     )
  45.     (t pts)
  46.   )
  47. )


[/code]

点评

加FUNC感觉复杂了吧,需要反的,reverse下结果不就行了,而且排序有一种方向就够了。参数多了,反而分散注意力了。固定下逆时针方向就行了(左下右上方向)  详情 回复 发表于 2014-11-30 23:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-30 23:34:10 | 显示全部楼层
st788796 发表于 2014-11-30 23:00
func 正向排 '< , 反向排 ‘>
上面写法生成太多的 kPointOnCurve,修改如下

加FUNC感觉复杂了吧,需要反的,reverse下结果不就行了,而且排序有一种方向就够了。参数多了,反而分散注意力了。固定下逆时针方向就行了(左下右上方向)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-1 08:34:34 | 显示全部楼层
既然给了点表,方向自己应该知道,函数就按给定pts方向排
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2015-10-19 21:44:12 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 12:59 , Processed in 0.513215 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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