直线和圆弧的排序列表
大家好,这是我在论坛上的第一篇帖子,虽然我已经读了几年了。
在过去的几个月里,我一直在从事一项激情项目/爱好。我想将cad数据(直线、圆弧)导出到cnc机器。我似乎被卡住了,我有种感觉,随着时间的推移,我正在使代码变得更糟糕。
我有一个用直线、圆弧和切割绘制的零件,也必须用直线和圆弧(在3D中)绘制。我的目标是对所有连接的直线/圆弧进行排序,以便获得连续点的列表。每个新剪切都应该附加相同的列表。
例子:
(列出cut1-1 cut1-2 cut1-3 cut2-1 cut2-2 cut2-3 cut2-4 cut3-1 cut3-2…等)
到目前为止,我写了大约50Kb的代码,但它非常草率和低效,而且它并不总是按预期对直线和圆弧进行排序。
我不确定你是否有时间/耐心通读整件事,所以我会快速总结一下逻辑。
--------------
(ssget行)
(重复sslength
(将起点添加到列表)
(将端点添加到列表)
)
(与弧的步骤相同)
(合并直线的起点和终点列表)
(移除未连接的管线)
(与弧的步骤相同)
(将直线和圆弧添加到单个列表)
;;; 直线有2个点(ctr startX endX startY endY startZ endZ)-长度7
;;; 弧有3个点(crt startX midX endX startY midY endY startZ midZ endZ)-长度10
(下面是我失败的排序部分)
我使用FOREACH比较了圆弧和直线的X和Y的起点和终点。它效率不高,并且不能给出一致的结果。
如果需要,我可以上传示例dwg和代码。
我认为我的逻辑全错了。如果你能帮我做一些排序算法,我将非常高兴。提前谢谢你。 cnc是否仅识别圆弧或直线? 我可以给它提供直线、圆弧和圆。 我认为在这一点上,示例绘图将优于代码提供。听起来使用普林斯将是一个不错的选择。 我准备了一个最坏的情况,展示了我能遇到的大部分情况。
工件高度为9mm。我现在的做法如下:
我去掉了所有Z=9的顶线/弧。
我去掉了所有的垂直线。
这就剩下了Z=0上的所有弧/线(在本例中,在Z=3.34上还有4条线的槽)。
现在,我想对列表中所有连接的直线/圆弧进行排序。起点对我来说并不重要。基本上就是这样。
实例图纸 您可以使用我这里代码中的“grouppoints”函数返回列表列表,其中每个子列表表示一组连接点-当然,您可能需要调整代码以在输出中保留其他属性(例如弧中心/半径)。 谢谢你给李·麦克的信息。遗憾的是,我没有完全理解你的代码(我的技能水平远低于你)。我看到代码适用于这种列表
((点)(点))((点)(点)(点)))我不知道如何编辑它来处理我的列表。
以下是所附图纸的示例列表。点坐标基于零件的右下角。
线:
((12 108.457 108.457 145.739 202.165 9.0 9.0) (13 74.7268 108.457 145.739 145.739 9.0 9.0) (14 74.7268 74.7268 202.165 145.739 9.0 9.0) (15 108.457 74.7268 202.165 202.165 9.0 9.0) (16 121.317 121.317 72.8736 85.7702 9.0 9.0) (17 56.0645 118.817 70.3736 70.3736 9.0 9.0) (18 53.5645 53.5645 85.7702 72.8736 9.0 9.0) (19 118.817 56.0645 88.2702 88.2702 9.0 9.0) (20 159.135 153.951 97.0091 97.0091 9.0 9.0) (21 159.135 159.135 0.0 97.0091 9.0 9.0) (22 118.167 232.096 231.126 231.126 9.0 9.0) (23 118.167 118.167 266.439 231.126 9.0 9.0) (24 141.583 141.583 246.29 266.439 9.0 9.0) (25 236.86 141.583 246.29 246.29 9.0 9.0) (26 153.951 153.951 97.0091 0.0 9.0 9.0) (61 159.135 159.135 0.0 97.0091 3.33584 3.33584) (63 159.135 153.951 97.0091 97.0091 3.33584 3.33584) (64 153.951 153.951 97.0091 0.0 3.33584 3.33584))
弧:
((14 195.693 167.649 221.136 111.152 168.395 203.07 9.0 9.0 9.0 9.0)(12 53.5645 54.2967 56.0645 85.7702 87.538 88.2702 9.0 9.0 9.0)(11 56.0645 54.2967 53.5645 70.3736 71.1059 72.8736 9.0 9.0 9.0)(3 43.4322 49.8641 8.53788e-011 175.975 270.013 350.0 9.0 9.0 9.0 9.0 9.0)(1 4.83169e)-012 9.72401 43.4322 1.71697e-010 90.9474 175.975 9.0 9.0 9.0)(4 250.0 211.121 195.693 9.42606e-011 49.8476 111.152 9.0 9.0 9.0 9.0)(7 236.86 247.456 250.0 246.29 297.635 350.0 9.0 9.0 9.0)(9 221.136 226.928 232.096 203.07 216.976 231.126 9.0 9.0 9.0)(10 118.817 120.585 121.317 70.3736 71.1059 72.8736 9.0 9.0 9.0)(13 121.317 120.0 585 118.817 85.7702 87.538 88.2702 9.0 9.0 9.0)(15 141.583 129.875 118.167 266.439 278.148 266.439 9.0 9.0 9.0 9.0)
线路列表为(计数器X1 X2 Y1 Y2 Z1 Z2)
弧列表为(计数器X1 Xmid X2 Y1 Ymid Y2 Z1 Zmid Z2) 另一个很棒的cnc人。出于好奇,你用的是什么数控机床。我自己也有一个shapeoko。 变量cl包含剪切列表
以下是我会尝试的:
(defun c:cutlist (/ ss i en ed z zl ssp c d
ce ra sa ea ia sp ep mp) ; cl global
(while (not ss)
(setq ss (ssget (list (cons 0 "ARC,LINE")(list 210 0 0 1)))))
(setq i 0)
(while (setq en (ssname ss i))
(setq ed (entget en)
z (cadddr (assoc 10 ed)))
(if (not (member z zl))
(setq zl (cons z zl)))
(setq i (1+ i)))
(setq ssp (ssadd))
(foreach z zl
(while (setq ss (ssget "X" (list (cons 0 "ARC,LINE")
(cons -4 "*,*,=")
(list 10 0 0 z)
(list 210 0 0 1))))
(command "_.PEDIT" (ssname ss 0) "_Yes" "_Join" ss "" "X")
(ssadd (entlast) ssp)))
(setq i 0)
(while (setq en (ssname ssp i))
(command"_.EXPLODE" en)
(setq i (1+ i)))
(setq cl nil c 1)
(foreach z zl
(setq ss (ssget "X" (list (cons 0 "ARC,LINE")
(cons -4 "*,*,=")
(list 10 0 0 z)
(list 210 0 0 1))))
(setq i 0)
(while (setq en (ssname ss i))
(setq ed (entget en))
(cond ((= "LINE" (cdr (assoc 0 ed)))
(setq d (list c (cadr (assoc 10 ed))
(cadr (assoc 11 ed))
(caddr (assoc 10 ed))
(caddr (assoc 11 ed))
(cadddr (assoc 10 ed))
(cadddr (assoc 11 ed)))))
((= "ARC" (cdr (assoc 0 ed)))
(setq ce (cdr (assoc 10 ed))
ra (cdr (assoc 40 ed))
sa (cdr (assoc 50 ed))
ea (cdr (assoc 51 ed))
ia (if (> sa ea)
(+ (- (* 2 pi) sa) ea)
(- ea sa))
sp (polar ce sa ra)
ep (polar ce ea ra)
mp (polar ce (+ sa (* 0.5 ia)) ra)
d (list c (car sp)
(car mp)
(car ep)
(cadr sp)
(cadr mp)
(cadr ep)
(caddr sp)
(caddr mp)
(caddr ep)))))
(setq cl (cons d cl))
(setq c (1+ c))
(setq i (1+ i))))
(setq cl (reverse cl))
(prin1 cl)
(prin1))
这不适用于z值不等的线。
玩得高兴
-大卫 这可能会过滤掉不相等的z值线
(defun c:cutlist (/ ss i en ed z1 z2 zl ssp c d
ce ra sa ea ia sp ep mp) ; cl global
(while (not ss)
(setq ss (ssget (list (cons 0 "ARC,LINE")(list 210 0 0 1)))))
(setq i 0)
(while (setq en (ssname ss i))
(setq ed (entget en)
z1 (cadddr (assoc 10 ed))
z2 (cadddr (assoc 11 ed)))
(and (equal z1 z2)
(not (member z1 zl))
(setq zl (cons z1 zl)))
(setq i (1+ i)))
(setq ssp (ssadd))
(foreach z zl
(while (setq ss (ssget "X" (list (cons -4 "<OR")
(cons -4 "<AND")
(cons 0 "ARC")
(cons -4 "*,*,=")
(list 10 0 0 z)
(cons -4 "AND>")
(cons -4 "<AND")
(cons 0 "LINE")
(cons -4 "*,*,=")
(list 10 0 0 z)
(cons -4 "*,*,=")
(list 11 0 0 z)
(cons -4 "AND>")
(cons -4 "OR>")
(list 210 0 0 1))))
(command "_.PEDIT" (ssname ss 0) "_Yes" "_Join" ss "" "X")
(ssadd (entlast) ssp)))
(setq i 0)
(while (setq en (ssname ssp i))
(command"_.EXPLODE" en)
(setq i (1+ i)))
(setq cl nil c 1)
(foreach z zl
(setq ss (ssget "X" (list (cons -4 "<OR")
(cons -4 "<AND")
(cons 0 "ARC")
(cons -4 "*,*,=")
(list 10 0 0 z)
(cons -4 "AND>")
(cons -4 "<AND")
(cons 0 "LINE")
(cons -4 "*,*,=")
(list 10 0 0 z)
(cons -4 "*,*,=")
(list 11 0 0 z)
(cons -4 "AND>")
(cons -4 "OR>")
(list 210 0 0 1))))
(setq i 0)
(while (setq en (ssname ss i))
(setq ed (entget en))
(cond ((= "LINE" (cdr (assoc 0 ed)))
(setq d (list c (cadr (assoc 10 ed))
(cadr (assoc 11 ed))
(caddr (assoc 10 ed))
(caddr (assoc 11 ed))
(cadddr (assoc 10 ed))
(cadddr (assoc 11 ed)))))
((= "ARC" (cdr (assoc 0 ed)))
(setq ce (cdr (assoc 10 ed))
ra (cdr (assoc 40 ed))
sa (cdr (assoc 50 ed))
ea (cdr (assoc 51 ed))
ia (if (> sa ea)
(+ (- (* 2 pi) sa) ea)
(- ea sa))
sp (polar ce sa ra)
ep (polar ce ea ra)
mp (polar ce (+ sa (* 0.5 ia)) ra)
d (list c (car sp)
(car mp)
(car ep)
(cadr sp)
(cadr mp)
(cadr ep)
(caddr sp)
(caddr mp)
(caddr ep)))))
(setq cl (cons d cl))
(setq c (1+ c))
(setq i (1+ i))))
(setq cl (reverse cl))
(prin1 cl)
(prin1))
不过很难看
页:
[1]
2