隧洞轮廓点坐标数据排序
说明:1、左边的图及数据为现场测量后直接绘制的图,坐标未经过排序,坐标点连线不能反应出实际的开挖轮廓线;2、右边的图及数据为人工修正的开挖轮廓线的图,反应实际的开挖轮廓线,坐标数据顺序为实际需要的数据顺序;
3、左右两图的轮廓点数据坐标值完全一样,只是顺序不一样。
4、对断面数据量很大时如何进行数据排序,能否有一小程序进行排序,以满足实际需要?
5、可能描述的不一定很清楚,见示例图。
希望有朋友能给予解答,先此谢过。
本帖最后由 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)
)
以后有求助,除了传DWG图外,最好配上图片贴上来,方便论坛查看。你的意思是将现场生成的坐标 排序 生成右边的结果? 就是,通过程序进行排序得到右边数据表的顺序,谢谢版主 zbwei120 发表于 2016-12-1 22:05
数据是左边那个表,还是左边那些图形 点 ? 左边的点已经都画出来了,就差编号?
可能是我没表达清楚,左边的图是根据左边的数据直接在CAD进行绘图的,但不是反应实际的情况,实际的情况应是右边的图,即应该根据右边的数据绘出来的图才能满足实际情况的。右边的数据是我根据手工将图修正好后提取出来贴上来给大家看的。因此需要进行个坐标排序,左边数据排序后得到右边表格的数据,然后直接给图即可满足要求。 本帖最后由 newer 于 2016-12-1 22:52 编辑
和我问你的不矛盾啊,初始数据就是左边的表格, 然后生成右边的表格和右边的图形? 还有序号1 不一定非和你右边的图形一样吧? 对的,序号不需要一致。 图已能画好,多谢版主。下来再慢慢看。 zbwei120 发表于 2016-12-2 17:48
能用就好,那你别忘了在答案帖子下面, 设为最佳答案,把悬赏给结了,结贴吧。
版主对晓东插件真的是非常熟悉,佩服,佩服。 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
不客气,理解 点表沿着曲线排序 xdrx_points_sortoncurve 就行了。
其实加一个角度判断就行,求每个轮廓上的节点和轨道中桩点的角度,以360度这个范围排序,连线就自然是一个环形了。 这个我是实现过
页:
[1]
2