明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 皇上快溜

[提问] 这个程序有时会漏选

[复制链接]
发表于 2016-9-14 22:54:08 | 显示全部楼层
  1. ;; tt(圆或弧统计);; [url]http://bbs.mjtd.com/thread-173339-1-1.html[/url]
  2. (defun c:tt ()
  3.   (setq        p4  (getpoint "\n请输入图框左下角: ")
  4.         p5  (getcorner p4 "\n请输入图框右上角: ")
  5.         p1  (getpoint "\n请输入要统计的左下角: ")
  6.         p0  (getcorner p1 "\n请输入要统计的右上角: ")
  7.         p3  (getpoint "\n请输入统计文字位置: ")
  8.         p8  (getpoint "\n请输入座标放置位置: ")
  9.         x1  (car p1)
  10.         y1  (cadr p1)
  11.         x4  (car p4)
  12.         x5  (car p5)
  13.         w   (- x5 x4)
  14.         h   (* (/ w 280 1.) 2)
  15.         p9  (polar p8 0 (* 4 h))
  16.         p10 (polar p8 0 (* 14 h))
  17.         p11 (polar p8 0 (* 22 h))
  18.         p12 (polar p8 (* 1.5 pi) h)
  19.         p13 (polar p11 (* 1.5 pi) h)
  20.   )
  21.   (command "line" p12 p13 "")
  22.   (command "text" "ml" p9 h 0 "X")
  23.   (command "text" "ml" p10 h 0 "Y")
  24.   (setq        txt "ABCDEFGHIJKLMNOPQ"
  25.         ss  (ssget "w" p1 p0 '((0 . "arc,circle")))
  26.         i   1
  27.         pt  p3
  28.   )
  29.   (while (and ss (> (sslength ss) 0))
  30.     (setq en (ssname ss 0))
  31.     (setq end (entget en))
  32.     (setq rad (+ (cdr (assoc 40 end)) 0.000))
  33.     (setq pci (cdr (assoc 0 end)))
  34.     (setq d (rtos (* 2 rad)))
  35.     (setq ssa (ssget "w" p1 p0 (list (cons 40 rad) (cons 0 pci))))
  36.     (setq nn (sslength ssa))
  37.     (setq stxt (substr txt i 1))
  38.     (setq m 0)
  39.     (setq x 0)
  40.      (repeat nn
  41.       (setq een (ssname ssa m))
  42.       (setq eend (entget een))
  43.       (setq cen (cdr (assoc 10 eend)))
  44.       (setq xxx (- (+ (car cen)) x1))
  45.       (setq yyy (- (+ (cadr cen)) y1))
  46.       (setq xxxt (rtos xxx))
  47.       (setq yyyt (rtos yyy))
  48.       (setq ssb (ssget "x" (list (cons 10 cen))))
  49.       (setq nnn (sslength ssb))
  50.       (if (= nnn 2)
  51.         (progn
  52.           (setq f (ssname ssb 0))
  53.           (setq g (ssname ssb 1))
  54.           (setq fn (entget f))
  55.           (setq gn (entget g))
  56.           (setq radf (+ (cdr (assoc 40 fn)) 0.000))
  57.           (setq radg (+ (cdr (assoc 40 gn)) 0.000))
  58.           (setq radma (max radf radg))
  59.           (setq radmi (min radf radg))
  60.           (setq p2 (polar cen (* 1.75 pi) (+ 4 radma)))
  61.           (if (= rad radf)
  62.             (setq ss (ssdel g ss))
  63.             (setq ss (ssdel f ss))
  64.           )
  65.           (if (= rad radf)
  66.             (setq hn fn)
  67.             (setq hn gn)
  68.           )
  69.           (setq ty (cdr (assoc 0 hn)))
  70.           (setq dma (rtos (* 2 radma)))
  71.           (setq dmi (rtos (* 2 radmi)))
  72.           (if (= ty "CIRCLE")
  73.             (setq sssstxt (strcat " %%c" dma "<CB>"))
  74.             (setq sssstxt (strcat " M" dma))
  75.           )
  76.           (setq ssstxt (strcat "-%%C" dmi "<THR>" sssstxt))
  77.         )
  78.         (setq p2     (polar cen (* 1.75 pi) (+ 3 rad))
  79.               ssstxt (strcat "-%%C" (rtos (* 2 rad) 2 3) "<THR>")
  80.         )
  81.       )
  82.       (setq x (+ 1 x))
  83.       (setq xt (itoa x))
  84.       (setq xtxt (strcat stxt xt))
  85.       (setq xxxxt (strcat xtxt ":"))
  86.       (command "text" "ml" p2 h 0 xtxt)
  87.       (setq p8 (polar p8 (* 1.5 pi) (* 2 h)))
  88.       (setq p9 (polar p9 (* 1.5 pi) (* 2 h)))
  89.       (setq p10 (polar p10 (* 1.5 pi) (* 2 h)))
  90.       (setq p11 (polar p11 (* 1.5 pi) (* 2 h)))
  91.       (command "line"
  92.                (polar p8 (* 1.5 pi) h)
  93.                (polar p11 (* 1.5 pi) h)
  94.                ""
  95.       )
  96.       (command "text" "ml" p8 h 0 xxxxt)
  97.       (command "text" "ml" p9 h 0 xxxt)
  98.       (command "text" "ml" p10 h 0 yyyt)
  99.       (setq ss (ssdel een ss))
  100.       (setq m (+ 1 m))
  101.     )
  102.      (setq sstxt (strcat stxt " : " (itoa nn) ssstxt))
  103.     (command "text" "ml" pt h 0 sstxt)
  104.     (setq i (+ i 1))
  105.     (setq pt (polar pt (* 1.5 pi) (* 1.5 h)))
  106.   )
  107.   (princ)
  108. )
 楼主| 发表于 2016-9-14 23:12:49 | 显示全部楼层
本帖最后由 皇上快溜 于 2016-9-14 23:16 编辑

态感谢xyp1964了,这么长的代码,幸苦你了。 因为网页有点问题,没法引用你的帖子回复你。

程序还是有点问题,统计到第二种r值的圆弧,就不再往下统计

我觉得可就跟圆弧有关,它有个识别螺纹的功能,270度圆弧那种,,,,(setq sssstxt (strcat " M" dma)

我试图从这里(setq sssstxt (strcat " M" dma)往上找,找不出关键函数在哪里
发表于 2016-9-18 14:44:41 来自手机 | 显示全部楼层
(defun c:tjj ()
  (setvar "cmdecho" 0)
  (setvar "osmode" 1)
  (command "osnapcoord" 2)
  (command "ucs" "w")
  ;(command "layer" "s" "txt" "");; 没有这个层就去掉吧
;;;  (setq p4 (getpoint "\n 请输入图框左下角:")) 只是为了取字高 可以和P1 P0共用 减少操作吧
;;;  (setq p5 (getpoint "\n 请输入图框右上角:"))
  (setq p1 (getpoint "\n 请输入图框左下角:"))
  (setq        x1 (car p1)
        y1 (cadr p1)
  )
  (setq p0 (getcorner p1 "\n 请输入图框右上角:"));;;可以用这个带有特效的
  (setq p3 (getpoint "\n 请输入统计文字位置:"))
  (setq        x4 (car p1);;;;
        x5 (car p0);;;;
  )
  (setq w (- x5 x4))
  (setq h (* (/ w 280) 2))
;;;  (setq p8 (getpoint "\n 请输入座标放置位置:")) 也是为了减少操作
  (setq p8 (polar p3 0.06 80))
  (setq p9 (polar p8 0 (* 4 h)))
  (setq p10 (polar p8 0 (* 14 h)))
  (setq p11 (polar p8 0 (* 22 h)))
  (setq p12 (polar p8 (* 1.5 pi) h))
  (setq p13 (polar p11 (* 1.5 pi) h))
  (setvar "osmode" 0);;
  (command "line" p12 p13 "");; 语法多了 ""
  (command "text" "ml" p9 h 0 "X")
  (command "text" "ml" p10 h 0 "Y")
  (setq txt "ABCDEFGHIJKLMNOPQ")
  (setq ss (ssget "w" p1 p0 '((0 . "circle"))));;;单个弧不再处理
  (setq i 1)
  (setq pt p3)
  (while (> (sslength ss) 0)
    (setq en (ssname ss 0))
    (setq end (entget en))
    (setq rad (cdr (assoc 40 end)));;;
    (setq pci (cdr (assoc 0 end)))
    (setq d (rtos (* 2 rad) 2));;; 不加指定的话 可以出意外啊 下面也一样
    (setq ssa (ssget "w" p1 p0 (list (cons 40 rad) (cons 0 pci))))
    (setq nn (sslength ssa))
    (setq stxt (substr txt i 1))
    (setq m 0)
    (setq x 0)
    (repeat nn
      (setq een (ssname ssa m))
      (setq eend (entget een))
      (setq cen (cdr (assoc 10 eend)))
;;;      (setq xxx (- (+ 0.000 (car cen)) x1))
;;;      (setq yyy (- (+ 0.000 (cadr cen)) y1))
      (setq xxx (- (car cen) x1))
      (setq yyy (- (cadr cen) y1))
      (setq xxxt (rtos xxx 2));;;
      (setq yyyt (rtos yyy 2));;;
      (setq ssb (ssget "w" p1 p0 (list (cons 10 cen))))
      (setq nnn (sslength ssb))
      (if (= nnn 2)
        (progn (setq f (ssname ssb 0))
               (setq g (ssname ssb 1))
               (setq fn (entget f))
               (setq gn (entget g))
;;;               (setq radf (+ (cdr (assoc 40 fn)) 0.000))
;;;               (setq radg (+ (cdr (assoc 40 gn)) 0.000))
               (setq radf (cdr (assoc 40 fn)))
               (setq radg (cdr (assoc 40 gn)))
               (setq radma (max radf radg))
               (setq radmi (min radf radg))
               (setq p2 (polar cen (* 1.75 pi) (+ 4 radma)))
               (if (= rad radf)
                 (setq ss (ssdel f ss));;上下调换
                 (setq ss (ssdel g ss));;
               )
               (if (= rad radf)
                 (setq hn gn);;上下调换
                 (setq hn fn);;
               )
               (setq ty (cdr (assoc 0 hn)))
               (setq dma (rtos (* 2 radma) 2 0));;;消零
               (setq dmi (rtos (* 2 radmi) 2));;;;
               (if (= ty "CIRCLE")
                 (setq sssstxt (strcat " %%c" dma "<CB>"))
                 (setq sssstxt (strcat " M" dma))
               )
               (setq ssstxt (strcat "-%%C" dmi "<THR>" sssstxt))
        )
        (setq p2     (polar cen (* 1.75 pi) (+ 3 rad))
              ssstxt (strcat "-%%C" (rtos (* 2 rad) 2 3) "<THR>")
              ss     (ssdel een ss);;; D
        )
      )
      (setq x (+ x 1));;;语法
      (setq xt (itoa x))
      (setq xtxt (strcat stxt xt))
      (setq xxxxt (strcat xtxt ":"))
      (command "text" "ml" p2 h 0 xtxt)
      (setq p8 (polar p8 (* 1.5 pi) (* 2 h)))
      (setq p9 (polar p9 (* 1.5 pi) (* 2 h)))
      (setq p10 (polar p10 (* 1.5 pi) (* 2 h)))
      (setq p11 (polar p11 (* 1.5 pi) (* 2 h)))
      (command "line" (polar p8 (* 1.5 pi) h) (polar p11 (* 1.5 pi) h) "");;语法多了 ""
      (command "text" "ml" p8 h 0 xxxxt)
      (command "text" "ml" p9 h 0 xxxt)
      (command "text" "ml" p10 h 0 yyyt)
      ;;;(setq ss (ssdel een ss)) D 放到上面去
      (setq m (1+ m));;;语法
    )
    (setq sstxt (strcat stxt " : " (itoa nn) ssstxt))
    (command "text" "ml" pt h 0 sstxt)
    (setq i (1+ i));;;语法
    (setq pt (polar pt (* 1.5 pi) (* 1.5 h)))
  )
  (setvar "osmode" 7)
  (princ);;;没见过这函数,自定义的吗?
)
都是搞模具的 给你改了 拿去看看效果吧
 楼主| 发表于 2016-9-18 20:53:21 | 显示全部楼层
wen1235 发表于 2016-9-18 14:44
(defun c:tjj ()
  (setvar "cmdecho" 0)
  (setvar "osmode" 1)

高!不胜感激,我慢慢观摩一下先
 楼主| 发表于 2016-9-18 22:51:46 | 显示全部楼层
wen1235 发表于 2016-9-18 14:44
(defun c:tjj ()
  (setvar "cmdecho" 0)
  (setvar "osmode" 1)

你好,同心圆会重复统计,请问改哪里,谢谢
发表于 2016-9-19 07:38:08 | 显示全部楼层
Sylvanas 发表于 2016-9-14 16:05
并没有漏选,(ssget "w") 和 (ssget "c") 只能选当前显示范围内的图元,应该是缩放导致显示不完整

解 ...

正解,已经说的很清楚了
①视野范围内才可选中
②ssget参数C与W的区别
 楼主| 发表于 2016-9-19 20:53:08 | 显示全部楼层
革天明 发表于 2016-9-19 07:38
正解,已经说的很清楚了
①视野范围内才可选中
②ssget参数C与W的区别

你好,我多次在视野范围内点选,仍出问题,是我理解和表述有误,,,原程序选取动作是没有问题的,单是它一遇到圆弧就出出错,不再往下统计。13的程序完善了这一问题,但是又产生了新问题,同心圆重复统计,即同一圆心上的两个圆,各自有一个不同的编码,想请你帮我看看哪里改一下可以解决这一问题,谢谢
发表于 2016-9-20 14:56:43 | 显示全部楼层
皇上快溜 发表于 2016-9-19 20:53
你好,我多次在视野范围内点选,仍出问题,是我理解和表述有误,,,原程序选取动作是没有问题的,单是它 ...

能否上传dwg进行测试,你给出想要的结果
 楼主| 发表于 2016-9-20 16:11:24 | 显示全部楼层
革天明 发表于 2016-9-20 14:56
能否上传dwg进行测试,你给出想要的结果

 楼主| 发表于 2016-9-20 16:12:39 | 显示全部楼层

本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 12:42 , Processed in 0.163074 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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