明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2236|回复: 16

[提问] 选择集内圆弧半径统计

[复制链接]
发表于 2020-7-6 11:21:48 | 显示全部楼层 |阅读模式
零件内R角大小影响线切割报价,0.1R角是0.15R角的3倍费用。
向各位大佬请教,能否用程序把内R角分类统计显示出来。
图中0.5是内R,0.2是外R。外R不影响加工费用。


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-8-16 16:13:00 | 显示全部楼层
(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 '()                        ;自建的点位数据表
          rl  0
    )
    (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表
      pn  0
    )
    (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)
)
发表于 2020-9-26 00:14:31 | 显示全部楼层
(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 '()                        ;  自建的点位数据表
          rl  0
    )
    (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表
      pn  0
    )
    (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.com  c:Nr for ffh..<PLINRE内形最小内R> -"
  )
  (princ)
)
 楼主| 发表于 2020-10-29 09:46:04 | 显示全部楼层
本帖最后由 andyding 于 2020-10-29 11:25 编辑
前生 发表于 2020-9-26 00:14
(defun c:nr ()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (defun Pldir (pts)

前辈,这段程序已经嵌入进去了,可以识别内形最小R。
之前我忽略了一个问题,如果是冲子或者成型零件,要识别外形最小内R,识别的R与现程序刚好相反。用现有这段程序要怎么改才能识别?
再次求助,请赐教!


已经搞好了。谢谢!

发表于 2020-7-10 01:30:04 | 显示全部楼层
慢走丝不好混呀!用统赢R角标注自己再看看就是了
 楼主| 发表于 2020-7-15 11:14:01 | 显示全部楼层
xzklk 发表于 2020-7-10 01:30
慢走丝不好混呀!用统赢R角标注自己再看看就是了

想搞一个计算线割费的小程序,卡在这里了。
发表于 2020-7-16 21:49:55 | 显示全部楼层
对于PLINE线来说,首先判断顺逆,再根据42的值判断是内R还是外R。。。。。。。。。。。。。
 楼主| 发表于 2020-7-17 09:37:50 | 显示全部楼层
前生 发表于 2020-7-16 21:49
对于PLINE线来说,首先判断顺逆,再根据42的值判断是内R还是外R。。。。。。。。。。。。。

谢谢前辈指点。
 楼主| 发表于 2020-7-17 10:41:41 | 显示全部楼层
发表于 2020-8-14 23:49:38 | 显示全部楼层
同为模具行业    给个思路
可以筛出所有圆弧
然后用燕秀(我相信你会有)将圆弧变圆
再用燕秀的圆统计功能,就可以知道有几种小R角了

另一种思路
选出长度小于X的圆弧(需要自己写一下LISP)   变圆后统计
发表于 2020-8-15 07:48:39 | 显示全部楼层
为还在模具里混的同行&#128079;[鼓掌]
发表于 2020-8-16 15:55:43 | 显示全部楼层
针对顺时针的PLINE线,内R的42 为负。
针对逆时针的PLINE线,内R的42 为正。
究是原因,对于ARC来说,均为逆弧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 23:59 , Processed in 0.203617 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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