明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: andyding

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

[复制链接]
发表于 2020-8-16 16:13:36 | 显示全部楼层
很多代码是坛子里的,我们是搬运工
 楼主| 发表于 2020-9-25 17:17:20 | 显示全部楼层
前生 发表于 2020-8-16 16:13
(defun c:nr ()
;;;判断内形加工最小的R
  (setq        pan nil

谢谢前辈!这段程序老提示没有选到合适对象。
发表于 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-9-26 00:15:09 | 显示全部楼层
andyding 发表于 2020-9-25 17:17
谢谢前辈!这段程序老提示没有选到合适对象。

你CAD 的版本为多少?
 楼主| 发表于 2020-10-10 09:50:18 | 显示全部楼层
前生 发表于 2020-9-26 00:15
你CAD 的版本为多少?

我用的2020版的
 楼主| 发表于 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与现程序刚好相反。用现有这段程序要怎么改才能识别?
再次求助,请赐教!


已经搞好了。谢谢!

发表于 2023-7-1 21:50:50 | 显示全部楼层

这个好像挺有用的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 23:54 , Processed in 0.188121 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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