选择集内圆弧半径统计
零件内R角大小影响线切割报价,0.1R角是0.15R角的3倍费用。向各位大佬请教,能否用程序把内R角分类统计显示出来。
图中0.5是内R,0.2是外R。外R不影响加工费用。
(defun c:nr ()
;;;判断内形加工最小的R
(setq pan nil
wpl nil
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun nnr ()
(setq r-list (list 100))
(setq Wr-list (list 100))
(PrinC "\n这是对 LWPolyLine 进行数据分析的基本程序...")
(SetQ pel (EntGet pen) ;取出对象数据表
pel (Member '(100 . "AcDbPolyline") pel) ;取出其中的有关数据
pln (Cdr (Assoc 90 pel)) ;取出控制点数量
ptp (Cdr (Assoc 70 pel)) ;取出结束片段类型
)
(SetQ pan 6 ;数据读取序号初值
wpl '() ;自建的点位数据表
rl0
)
(while (setq plist (nth pan pel))
(if (= 10 (car plist))
(SetQ plp (Cdr (Nth pan pel)) ;取出控制点点位
par (Cdr (Nth (+ 3 pan) pel)) ;取出弓弦比
wpl (Cons (List plp par) wpl) ;将数据加到WPL表中
rl(1+ rl)
)
)
(SetQ pan (+ 1 pan)) ;序号步进
;;; (princ rl)(princ "\n")
)
(SetQ ; rl(Length wpl)
wpl (Cons (Last wpl) wpl) ;加入封闭点
wpl (Reverse wpl) ;整理WPL表
pn0
)
(SetQ clk (If (Or (= 0 ptp) (= 128 ptp))
"开口"
"封闭"
)
) ;判断封闭与口
(Repeat (If (= "开口" clk)
(- rl 1)
rl
) ;逐点分析
(SetQ al (Nth pn wpl) ;取出点数据表
pt (Car al) ;取出点位
)
(if (Pldir (plinexy PeN))
(PROGN
(If (And (> (Cadr al) 0.0) (Nth pn wpl)) ;如果是弧片断
(Progn (SetQ gx (Cadr al) ;取出弓比
bj (* (ATAN (ABS gx)) 4) ;计算包角
np (Car (Nth (1+ pn) wpl)) ;取出下一点位
xc (* 0.5 (Distance pt np)) ;半弦长计算
gg (* gx xc) ;弓高计算
rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg))
;半径计算
)
(setq r-list (cons (abs rr) r-list))
)
) ;"逆时针";弧度>0为内弧,<0为外弧
(If (And (< (Cadr al) 0.0) (Nth pn wpl)) ;如果是弧片断
(Progn (SetQ gx (Cadr al) ;取出弓比
bj (* (ATAN (ABS gx)) 4) ;计算包角
np (Car (Nth (1+ pn) wpl)) ;取出下一点位
xc (* 0.5 (Distance pt np)) ;半弦长计算
gg (* gx xc) ;弓高计算
rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg))
;半径计算
)
(setq Wr-list (cons (abs rr) Wr-list))
)
)
(if (< (abs rr) 0.15)
(ENTMAKE
(LIST
(CONS 0 "TEXT")
(Cons 7 "hz")
(cons 8 "OURSFHMB")
(cons 62 101)
(cons
10
np
)
(cons 40 0.2)
(cons
1
(strcat "R" (rtos (abs RR) 2 3))
)
(cons 50 0.0)
(cons 41 0.7)
)
)
)
)
(PROGN
(If (And (< (Cadr al) 0.0) (Nth pn wpl)) ;如果是弧片断
(Progn (SetQ gx (Cadr al) ;取出弓比
bj (* (ATAN (ABS gx)) 4) ;计算包角
np (Car (Nth (1+ pn) wpl)) ;取出下一点位
xc (* 0.5 (Distance pt np)) ;半弦长计算
gg (* gx xc) ;弓高计算
rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg))
;半径计算
)
(setq r-list (cons (abs rr) r-list))
)
) ;"顺时针",弧度<0为内弧,>0为外弧
(If (And (> (Cadr al) 0.0) (Nth pn wpl)) ;如果是弧片断
(Progn (SetQ gx (Cadr al) ;取出弓比
bj (* (ATAN (ABS gx)) 4) ;计算包角
np (Car (Nth (1+ pn) wpl)) ;取出下一点位
xc (* 0.5 (Distance pt np)) ;半弦长计算
gg (* gx xc) ;弓高计算
rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg))
;半径计算
)
(setq Wr-list (cons (abs rr) Wr-list))
)
)
(if (< (abs rr) 0.15)
(ENTMAKE
(LIST
(CONS 0 "TEXT")
(Cons 7 "hz")
(cons 8 "OURSFHMB")
(cons 62 101)
(cons
10
np
;;; (polar pn (angle pn np) (* 0.5 (distance pn np)))
)
(cons 40 0.2)
(cons
1
(strcat "R" (rtos (abs RR) 2 3))
)
(cons 50 0.0)
(cons 41 0.7)
)
)
)
)
)
(SetQ pn (1+ pn)) ;搜索序号步进
)
;;; (IF (> (length r-list) 1)
;;; (progn
;;; (ENTMAKE
;;; (LIST
;;; (CONS 0 "TEXT")
;;; (Cons 7 "hz")
;;; (cons 8 "OURSFHMB")
;;; (cons 62 101)
;;; (cons
;;; 10
;;; (trans
;;; (getpoint (trans (car (last wpl)) 0 1)
;;; "\n 请点取点标注内形,最小内R"
;;; )
;;; 1
;;; 0
;;; )
;;; )
;;; (cons 40 1)
;;; (cons
;;; 1
;;; (strcat "内形,最小内R "
;;; (vl-prin1-to-string (nth 0 (vl-sort r-list '<)))
;;; )
;;; )
;;; (cons 50 0.0)
;;; (cons 41 0.7)
;;; )
;;; )
;;; )
;;; )
;;; (IF (> (length wr-list) 1)
;;; (progn
;;; (ENTMAKE
;;; (LIST
;;; (CONS 0 "TEXT")
;;; (Cons 7 "hz")
;;; (cons 8 "OURSFHMB")
;;; (cons 62 2)
;;; (cons
;;; 10
;;; (trans
;;; (getpoint (trans (car (last wpl)) 0 1)
;;; "\n 请点取点标注外形,最小内R"
;;; )
;;; 1
;;; 0
;;; )
;;; )
;;; (cons 40 1)
;;; (cons
;;; 1
;;; (strcat " 外形,最小内R "
;;; (vl-prin1-to-string (nth 0 (vl-sort wr-list '<)))
;;; )
;;; )
;;; (cons 50 0.0)
;;; (cons 41 0.7)
;;; )
;;; )
;;; (princ
;;; (strcat "最小外半径为R "
;;; (vl-prin1-to-string (nth 0 (vl-sort wr-list '<)))
;;; "顺时针"
;;; )
;;; )
;;; )
;;; )
(PrinC)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Pldir (pts)
(< (apply
'+
(mapcar
'(lambda (x y) (- (* (car x) (cadr y)) (* (car y) (cadr x))))
pts
(append (cdr pts) (list (car pts)))
)
)
0
)
)
(defun plinexy (e / p i)
(setq i -1)
(mapcar (function (lambda (x) (list (car x) (cadr x))))
(reverse (repeat (fix (1+ (vlax-curve-getEndParam e)))
(setq i (1+ i)
p (cons (vlax-curve-getPointAtParam e i) p)
)
)
)
)
(if (equal (car p) (last p))
(reverse (cdr (reverse p)))
p
)
)
;;;(if (setq PeN (car(entsel"\n 选择闭合多线段")))
(while (setq en (entsel "\n 选择闭合多线段"))
(setq PeN (car en))
(cond
((wcmatch (cdr (assoc 0 (entget PeN))) "*POLYLINE")
(nnr)
)
(t (prompt "\n 没有选择到合适的实体:__"))
)
(prompt "\n 没有选择到合适的实体:__")
)
(princ
"\n 13764852693@139.com ** ** c:Nr for ffh- <PLINRE内形最小内R> -"
)
(princ)
) (defun c:nr ()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Pldir (pts)
(< (apply
'+
(mapcar
'(lambda (x y) (- (* (car x) (cadr y)) (* (car y) (cadr x))))
pts
(append (cdr pts) (list (car pts)))
)
)
0
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun plinexy (e / p i)
(setq i -1)
(mapcar (function (lambda (x) (list (car x) (cadr x))))
(reverse (repeat (fix (1+ (vlax-curve-getEndParam e)))
(setq i (1+ i)
p (cons (vlax-curve-getPointAtParam e i) p)
)
)
)
)
(if (equal (car p) (last p))
(reverse (cdr (reverse p)))
p
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;判断内形加工最小的R
;;;(setq pan nil
;;; wpl nil
;;;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun nnr ()
(setq pan nil
wpl nil
)
(setq r-list (list 100))
;;; (setq Wr-list (list 100))
(IF (Pldir (plinexy PeN))
(SETQ XXX 1.5)
(SETQ xxx 0.5)
) ;xxx=1.5 为逆时针
(PrinC "\n这是对 LWPolyLine 进行数据分析的基本程序...")
(SetQ pel (EntGet pen) ;取出对象数据表
pel (Member '(100 . "AcDbPolyline") pel) ;取出其中的有关数据
pln (Cdr (Assoc 90 pel)) ;取出控制点数量
ptp (Cdr (Assoc 70 pel)) ;取出结束片段类型
)
(SetQ pan 1 ;6 ;数据读取序号初值
wpl '() ;自建的点位数据表
rl0
)
(while (setq plist (nth pan pel))
(if (= 10 (car plist))
(SetQ plp (Cdr (Nth pan pel)) ; 取出控制点点位
par (Cdr (Nth (+ 3 pan) pel)) ; 取出弓弦比
wpl (Cons (List plp par) wpl) ;将数据加到WPL表中
rl(1+ rl)
)
)
(SetQ pan (+ 1 pan)) ;序号步进
)
(SetQ ; rl(Length wpl)
wpl (Cons (Last wpl) wpl) ;加入封闭点
wpl (Reverse wpl) ;整理WPL表
pn0
)
(SetQ clk (If (Or (= 0 ptp) (= 128 ptp))
"开口"
"封闭"
)
) ;判断封闭与口
(Repeat (If (= "开口" clk)
(- rl 1)
rl
) ;逐点分析
(SetQ al (Nth pn wpl) ;取出点数据表
pt (Car al) ;取出点位
)
;;; (if (Pldir (plinexy PeN))
(if (= xxx 1.5)
(PROGN
(If (And (> (Cadr al) 0.0) (Nth pn wpl)) ;如果是弧片断
(Progn (SetQ gx (Cadr al) ;取出弓比
bj (* (ATAN (ABS gx)) 4) ;计算包角
np (Car (Nth (1+ pn) wpl)) ;取出下一点位
xc (* 0.5 (Distance pt np)) ;半弦长计算
gg (* gx xc) ;弓高计算
rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg))
;半径计算
)
(ENTMAKE
(LIST
(CONS 0 "TEXT")
(Cons 7 "hz")
(cons 8 "OURSFHMB")
(cons 62
(if (< (abs RR) 0.15)
1
7
)
)
(cons 10 np)
(cons 40 0.2)
(cons 1 (strcat "R" (rtos (abs RR) 2 3)))
(cons 50 0.0)
(cons 41 0.7)
)
)
(setq r-list (cons (abs rr) r-list))
)
) ;"逆时针";弧度>0为内弧,<0为外弧
)
(PROGN
(If (And (< (Cadr al) 0.0) (Nth pn wpl)) ;如果是弧片断
(Progn (SetQ gx (Cadr al) ;取出弓比
bj (* (ATAN (ABS gx)) 4) ;计算包角
np (Car (Nth (1+ pn) wpl)) ;取出下一点位
xc (* 0.5 (Distance pt np)) ;半弦长计算
gg (* gx xc) ;弓高计算
rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg))
;半径计算
)
(ENTMAKE
(LIST
(CONS 0 "TEXT")
(Cons 7 "hz")
(cons 8 "OURSFHMB")
(cons 62
(if (< (abs RR) 0.15)
1
7
)
)
(cons 10 np)
(cons 40 0.2)
(cons 1 (strcat "R" (rtos (abs RR) 2 3)))
(cons 50 0.0)
(cons 41 0.7)
)
)
(setq r-list (cons (abs rr) r-list))
)
) ;"顺时针",弧度<0为内弧,>0为外弧
)
)
(SetQ pn (1+ pn)) ;搜索序号步进
)
(PrinC)
)
(while (setq en (entsel "\n 选择闭合多线段"))
(setq PeN (car en))
(cond
((wcmatch (cdr (assoc 0 (entget PeN))) "*POLYLINE")
(nnr)
)
(t (prompt "\n 没有选择到合适的实体:__"))
)
(setq en nil)
)
(princ
"\n **Works For Qiany**13764852693@139.comc:Nr for ffh..<PLINRE内形最小内R> -"
)
(princ)
) 本帖最后由 andyding 于 2020-10-29 11:25 编辑
前生 发表于 2020-9-26 00:14
(defun c:nr ()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Pldir (pts)
前辈,这段程序已经嵌入进去了,可以识别内形最小R。
之前我忽略了一个问题,如果是冲子或者成型零件,要识别外形最小内R,识别的R与现程序刚好相反。用现有这段程序要怎么改才能识别?
再次求助,请赐教!
已经搞好了。谢谢!
慢走丝不好混呀!用统赢R角标注自己再看看就是了 xzklk 发表于 2020-7-10 01:30
慢走丝不好混呀!用统赢R角标注自己再看看就是了
想搞一个计算线割费的小程序,卡在这里了。 对于PLINE线来说,首先判断顺逆,再根据42的值判断是内R还是外R。。。。。。。。。。。。。 前生 发表于 2020-7-16 21:49
对于PLINE线来说,首先判断顺逆,再根据42的值判断是内R还是外R。。。。。。。。。。。。。
谢谢前辈指点。 http://bbs.mjtd.com/forum.php?mod=viewthread&tid=56215&replyID=&skin=1 同为模具行业 给个思路
可以筛出所有圆弧
然后用燕秀(我相信你会有)将圆弧变圆
再用燕秀的圆统计功能,就可以知道有几种小R角了
另一种思路
选出长度小于X的圆弧(需要自己写一下LISP) 变圆后统计 为还在模具里混的同行👏[鼓掌] 针对顺时针的PLINE线,内R的42 为负。
针对逆时针的PLINE线,内R的42 为正。
究是原因,对于ARC来说,均为逆弧。
页:
[1]
2