找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 11025|回复: 24

[原创] 给大家写了一个点表沿着曲线(或点表)排序的函数(5.30,11点18分更新)

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-30 00:56:32 | 显示全部楼层 |阅读模式

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

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

×
XDRX_API里面有个排序函数很有用,就用LISP模仿写了一个。

QQ截图20130530010300.png


排序对写程序很重要,这个函数可以把一个点表 沿着 图中的曲线实体的方向排序,也可以沿着另外一个点表(一些点构成PLINE)排序。具体应用很多要用到。

SortONCURVE.gif

测试命令TT
  1. (defun c:TT ( / a b e ed i len p10 pts ss x)
  2.   (if (and
  3.         (progn
  4.           (princ "\n选取要沿线排序的文字<退出>:")
  5.           (setq ss (ssget '((0 . "TEXT"))))
  6.         )
  7.         (setq e (car (entsel "\n拾取曲线<退出>:")))
  8.       )
  9.     (progn
  10.       (setq i -1
  11.             len (sslength ss)
  12.       )
  13.       (repeat len
  14.         (setq e1 (ssname ss (setq i (1+ i)))
  15.               ed (entget e1)
  16.               p10 (cdr (assoc 10 ed))
  17.               pts (cons p10 pts)
  18.         )
  19.       )
  20.       (setq a (Pnts-Sort-Cruve pts e)
  21.             b (mapcar
  22.                 '(lambda (x)
  23.                    (list (car x) (- (cadr x) 50))
  24.                  )
  25.                 a
  26.               )
  27.       )
  28.       (command "text" (car b) "25" "" "1")
  29.       (command "text" (cadr b) "25" "" "2")
  30.       (command "text" (caddr b) "25" "" "3")
  31.     )
  32.   )
  33.   (princ)
  34. )


排序函数收下豆 (2013.05.30  11.18分修改)

[sell=20]
  1. (defun Pnts-Sort-Cruve (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]

评分

参与人数 4D豆 +20 收起 理由
QiaoCheng + 5 冲着游手好闲的话买、奖
游手好闲 + 5 这代码写的绝了,我要是你,至少要卖100豆.
wowan1314 + 5 对我没用奖!
牢固 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-5-30 04:33:18 | 显示全部楼层
呵呵,好贵呀。要20豆。{:soso_e109:}
没办法,看完介绍后,太心动,太好奇了。看看吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-5-30 05:25:21 | 显示全部楼层
http://search.xdcad.net/f/discuz ... p;searchsubmit=true
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-30 05:38:37 | 显示全部楼层
呵呵,研究这个问题的人很多呀。好。一定跟各位高手好好学习学习。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2013-5-30 08:07:53 | 显示全部楼层
拾取图像,取其某一属性,对某些选集排序。有新意,赞!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-5-30 09:07:39 | 显示全部楼层
QiaoCheng 发表于 2013-5-30 08:49
建议生成的文字高度最好与原文字高度一致

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-30 09:14:06 | 显示全部楼层
本帖最后由 牢固 于 2013-5-30 09:24 编辑

这个函数还是有有一个Bug没有解决,就是当有排序的点在曲线端点之外时,这部分在曲线端点之外的点就无法排序了! ss.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-5-30 09:15:10 | 显示全部楼层
基本思路是什么?各图元组码10到曲线垂点,然后以垂点离曲线起点来排序?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-30 09:23:13 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-5-30 09:15
基本思路是什么?各图元组码10到曲线垂点,然后以垂点离曲线起点来排序?

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-5-30 09:55:04 | 显示全部楼层
牢固 发表于 2013-5-30 09:14
这个函数还是有有一个Bug没有解决,就是当有排序的点在曲线端点之外时,这部分在曲线端点之外的点就无法排 ...

是的,G版,虽然程序里面求getCloestPoint时候使用了扩展曲线T参数,但由于一些曲线无法EXTEND,所以对于SPLINE,POLYLINE等有你说的问题,但对LINE,ARC可以

这个函数设计的初衷不是为了在那些复杂的曲线上排点,主要是希望能沿着一条LINE就行了,因为很多操作应用基于一条LINE就够了,比如 逐点的尺寸标注,用户任意选点,然后沿着起点和终点这条线,把这些点排序,然后标注。

另外,函数是为程序服务的,所以对于具体应用,用户应该构造足够把这些点包含住的点表。

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-30 10:17:25 | 显示全部楼层
本帖最后由 牢固 于 2013-5-30 10:24 编辑
Lispboy 发表于 2013-5-30 09:55
是的,G版,虽然程序里面求getCloestPoint时候使用了扩展曲线T参数,但由于一些曲线无法EXTEND,所以对于 ...

getCloestPoint求出扩展曲线上的点没有用,因为这些点不在曲线上,getpointatparam得到的参数为nil,所以计算点时扩展是没有用的,当在曲线两头都有点时,这样的排序结果根本就是错误的!
我想排序之前还是要对排序曲线进行判断一下,
比如:1、曲线为直线,当排序的点有在直线外,可以构造Xline进行排序
         2、曲线为圆弧、开口椭圆,可以构造圆、封闭椭圆进行排序
         3、PLine,spline直接让它封闭或者延伸到排序点表构成的包围框边界后再排序
         
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-5-30 11:27:39 | 显示全部楼层
牢固 发表于 2013-5-30 10:17
getCloestPoint求出扩展曲线上的点没有用,因为这些点不在曲线上,getpointatparam得到的参数为nil,所以 ...

谢谢G版建议, 程序已经修改,加入了参照点表是2点的时候构造XLINE进行排序,其实,这个是我这个程序中最想要的。

下载过的朋友请重新下载。

2、3 回复:

由于函数设计的初衷是给LISP构造排序点表,所以主要的参数还是点表,对于边界扩展未知的如PLINE,SPLINE等还是不要硬延长了吧,因为即使封闭他们,也可能在排序点的内部,也没有结果。

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

使用道具 举报

发表于 2013-5-31 07:11:23 | 显示全部楼层
嗯,加入构造XLINE进行排序会更好用,多谢G版提供思路
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:54 , Processed in 0.406358 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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