zbwei120 发表于 2016-12-1 21:08:19

隧洞轮廓点坐标数据排序

说明:1、左边的图及数据为现场测量后直接绘制的图,坐标未经过排序,坐标点连线不能反应出实际的开挖轮廓线;
          2、右边的图及数据为人工修正的开挖轮廓线的图,反应实际的开挖轮廓线,坐标数据顺序为实际需要的数据顺序;
         3、左右两图的轮廓点数据坐标值完全一样,只是顺序不一样。
         4、对断面数据量很大时如何进行数据排序,能否有一小程序进行排序,以满足实际需要?
         5、可能描述的不一定很清楚,见示例图。
         希望有朋友能给予解答,先此谢过。



newer 发表于 2016-12-1 21:08:20

本帖最后由 newer 于 2016-12-2 11:01 编辑

zbwei120 发表于 2016-12-2 07:48

试试, 选文字的时候要选数字。




(defun c:tt ()
(xdrx_initssget "\n框选数字文字<退出>:")
(if (and
      (setq ss (xdrx_ssget '((0 . "TEXT"))))
      (setq ss (xd::pickset:tablesort ss 0 3 '> '<))
      (setq tb (XD::List:IsTable ss))
      )
    (progn
      (xdrx_begin)
      (setq pts (mapcar
                  '(lambda (x)
                     (list (atof (xdrx_getpropertyvalue (car x) "textstring"))
                           (atof (xdrx_getpropertyvalue (cadr x)
                                                      "textstring"
                                 )
                           )
                     )
                   )
                  ss
                )
       )
       (setq cir (apply 'xdrx_circle_make (xdrx_points_mincircle pts))
             pts (xdrx_points_sortOnCurve (entlast) pts)
             i 0
             pts1 (mapcar 'cadr pts)
             tb(mapcar '(lambda(x)(list (itoa (setq i (1+ i)))(car x)(cadr x)))pts1)
             tb (append (list (list "多段线点坐标" "" "")(list "序号" "X坐标" "Y坐标")) tb)
       )
       (xdrx_entity_delete cir)
       (if (not #suidao_h)
         (setq #suidao_h 0.25)
       )
       (if (setq h (getreal (xdrx_prompt "\n文字高<" #suidao_h ">:" t)))
         (setq #suidao_h h)
       )
       (setq cir (xdrx_polyline_make pts1 t))
       (setq i 0)
       (mapcar '(lambda(x)(xdrx_text_make (cadr x) (itoa (setq i (1+ i))) #suidao_h 0.0)) (reverse pts))
       (xd::text:init 1)
       (xd::table:makefromlist tb '(0 0 0) #suidao_h (/ #suidao_h 1.5))
       (xdrx_table_setrowheight (entlast) 0 (/ (* 7 #suidao_h) 3.0))
       (xd::drag:simplemove (entlast) "\n表格插入点:" 8 t)
       (xdrx_end)
    )
)
(princ)
)


newer 发表于 2016-12-1 21:54:28

以后有求助,除了传DWG图外,最好配上图片贴上来,方便论坛查看。你的意思是将现场生成的坐标 排序 生成右边的结果?

zbwei120 发表于 2016-12-1 22:05:48

就是,通过程序进行排序得到右边数据表的顺序,谢谢版主

newer 发表于 2016-12-1 22:12:30

zbwei120 发表于 2016-12-1 22:05


数据是左边那个表,还是左边那些图形 点 ? 左边的点已经都画出来了,就差编号?

zbwei120 发表于 2016-12-1 22:21:18

可能是我没表达清楚,左边的图是根据左边的数据直接在CAD进行绘图的,但不是反应实际的情况,实际的情况应是右边的图,即应该根据右边的数据绘出来的图才能满足实际情况的。右边的数据是我根据手工将图修正好后提取出来贴上来给大家看的。因此需要进行个坐标排序,左边数据排序后得到右边表格的数据,然后直接给图即可满足要求。

newer 发表于 2016-12-1 22:49:30

本帖最后由 newer 于 2016-12-1 22:52 编辑

和我问你的不矛盾啊,初始数据就是左边的表格, 然后生成右边的表格和右边的图形? 还有序号1 不一定非和你右边的图形一样吧?

zbwei120 发表于 2016-12-2 07:48:09

对的,序号不需要一致。

zbwei120 发表于 2016-12-2 17:48:39

图已能画好,多谢版主。下来再慢慢看。

newer 发表于 2016-12-2 18:51:56

zbwei120 发表于 2016-12-2 17:48


能用就好,那你别忘了在答案帖子下面, 设为最佳答案,把悬赏给结了,结贴吧。

zbwei120 发表于 2016-12-2 20:33:09

版主对晓东插件真的是非常熟悉,佩服,佩服。

newer 发表于 2016-12-2 20:58:58

zbwei120 发表于 2016-12-2 20:33


其实没用几个XDRX API, 关键是算法,然后找实现的API函数。

你这个问题,
1、主要是点按圆的排序,所以要先生成圆,就用了API的最小包围圆的函数xdrx_points_mincircle
2、排序就用的通用的点表沿着曲线排序函数xdrx_points_sortoncurve

这两部做完了,程序也就出来了,剩下的是构造表格的数据,然后用通用的表格生成函数xd::table:makefromlist生成表格在0,0,0点,最后用拖动函数xd::drag:simplemove移动到你指定的地方就OK了。

算法有了,写代码就很容易了。API几乎提供涵盖了所有的需要的操作的函数。看API手册就指定函数的用法了,平时常用的也就那么几个函数。

zbwei120 发表于 2016-12-2 21:06:37

以前弄过一个批量绘制隧洞开挖断面图的程序,但就这个坐标排序没弄好,有时就画出如示例图中的结果,现在好,再好好学习学习一下,再次感谢。

newer 发表于 2016-12-2 21:44:12

zbwei120 发表于 2016-12-2 21:06


不客气,理解 点表沿着曲线排序 xdrx_points_sortoncurve 就行了。

skg123 发表于 2021-5-21 23:33:38

其实加一个角度判断就行,求每个轮廓上的节点和轨道中桩点的角度,以360度这个范围排序,连线就自然是一个环形了。 这个我是实现过
页: [1] 2
查看完整版本: 隧洞轮廓点坐标数据排序