明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4256|回复: 8

求圆弧中点坐标程序能否简化?

[复制链接]
发表于 2006-4-6 22:27:00 | 显示全部楼层 |阅读模式
拟在程序中标注选择范围内所有圆弧,有以下程序,请高手指正!
  1. (vl-load-com)
  2. (setq ss (ssget '((0 . "ARC"))))
  3. (setq i -1)
  4. (setq osmodeOld (getvar "OSMODE"))
  5. (setvar "OSMODE" 0)
  6. (while (setq ent (ssname ss (setq i (1+ i))))
  7.     (setq obj (vlax-ename->vla-object ent))
  8.     ;;求圆弧中点坐标
  9.     (setq ptMid (vlax-curve-getpointatdist
  10.       obj
  11.       (/ (vlax-curve-getdistatparam
  12.       obj
  13.       (vlax-curve-getendparam obj)
  14.          )
  15.          2
  16.       )
  17.   )
  18.     )
  19.     ;;求圆弧中心坐标
  20.     (setq ptCen (cdr (assoc 10 (entget ent))))
  21.     ;;求圆弧中点与圆弧中心连结上靠近圆弧中点一点坐标
  22.     (setq ptMid0
  23.       (list
  24.    (+ (car ptMid) (* 0.001 (- (car ptCen) (car ptMid))))
  25.    (+ (cadr ptMid)
  26.       (* 0.001 (- (cadr ptCen) (cadr ptMid)))
  27.    )
  28.       )
  29.     )
  30.     (command "_.dimradius" (list ent ptMid) ptMid0)
  31. )
  32. (setvar "OSMODE" osmodeOld)
  33. (setq ss nil)
  34. (princ)
发表于 2006-4-6 23:55:00 | 显示全部楼层
  1. (defun c:test ()
  2.   (defun dxf (code elist) (cdr (assoc code elist)))
  3.   (setq ss (ssget '((0 . "ARC")))
  4. i  -1
  5.   )
  6.   (setvar "OSMODE" 0)
  7.   (while (setq s1 (ssname ss (setq i (1+ i))))
  8.     (setq ent (entget s1)
  9.    pt0 (dxf 10 ent)
  10.    pt  (polar pt0
  11.        (/ (+ (dxf 50 ent) (dxf 51 ent)) 2.0)
  12.        (dxf 40 ent)
  13.        )
  14.     )
  15.     (command "_.dimradius" (list s1 pt) pt0)
  16.   )
  17.   (princ)
  18. )
发表于 2006-4-7 04:05:00 | 显示全部楼层

凭直觉,

(/ (+ (dxf 50 ent) (dxf 51 ent)) 2.0) 是有问题的。

没有区分正反弧。例如,arc 起点角0,终点PI;另外一个 arc 起点PI,终点2pi(0)

.。。。。

发表于 2006-4-7 07:57:00 | 显示全部楼层
  1. (defun c:test ()
  2.   (vl-load-com)
  3.   (setq ss nil)
  4.   (setq ss (ssget '((0 . "ARC"))))
  5.   (setq i -1)
  6.   (setq osmodeOld (getvar "OSMODE"))
  7.   (setvar "OSMODE" 0)
  8.   (while (setq ent (ssname ss (setq i (1+ i))))
  9.     (setq dxf (entget ent))
  10.     (setq r    (cdr (assoc 40 dxf))
  11.    cen  (cdr (assoc 10 dxf))
  12.    ang1 (cdr (assoc 50 dxf))
  13.    ang2 (cdr (assoc 51 dxf))
  14.     )
  15.     (if (= ang2 0)
  16.       (setq ang2 (* pi 2.0))
  17.     )
  18.     (setq ptmid  (polar cen (/ (+ ang1 ang2) 2.0) r)
  19.    ptmid0 (polar cen (/ (+ ang1 ang2) 2.0) (* r 0.99))
  20.     )
  21.     (command "_.dimradius" (list ent ptMid) ptMid0)
  22.   )
  23.   (setvar "OSMODE" osmodeOld)
  24.   (princ)
  25. )
发表于 2006-4-7 14:20:00 | 显示全部楼层

From:  Doug Broad - view profile
Date:  Tues, Feb 11 2003 4:56 am 
Email:   "Doug Broad" <dbr...@earthlink.net>

Luis,
For 2D work with UCS = world this would be OK.
If you have arcs in 3D or a current UCS <> World then
you will have to do a lot more work.  Also, in order to
apply it within commands, you should either turn off
osnaps or ...

(defun midarc (ent / dxf ent info cen sa ea da ma)
  (defun dxf (k l)(cdr(assoc k l)))
  (and
    ent
    (setq info (entget ent))
    (= "ARC" (dxf 0 info))
    (setq cen (dxf 10 info));center
    (setq sa  (dxf 50 info));start
    (setq ea  (dxf 51 info));end
    (setq da  (- ea sa))
    (setq da (if (minusp da) (+ (* 2 pi) da) da))
    (setq ma (+ sa (/ da 2))))
  (if ma
    (polar cen ma (dxf 40 info))))

 

发表于 2006-4-7 22:04:00 | 显示全部楼层

测试没问题!

发表于 2006-4-8 07:45:00 | 显示全部楼层
xyp1964发表于2006-4-7 22:04:00 测试没问题!

我拿你的程序测试,问题很大呢,是我的标注设置有问题??????
发表于 2006-4-8 16:29:00 | 显示全部楼层
本帖最后由 作者 于 2006-4-10 22:05:06 编辑

  1. (load "xyp_lib.vlx") ;版本 V.20060314
  2. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  3. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  4. ★1·在acad.lsp中增加(load"xyp_lib")
  5. ■2·在每个程序内增加(load"xyp_lib")
  6. ■3·在command下,输入(load"xyp_lib")
  7. ■4·在菜单.mnl中增加(load"xyp_lib")
  8. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  9. [COLOR=red] ★通用函数下载地址:[/COLOR]
  10. [url]dispbbs.asp?boardID=3&ID=37554&page=1[/url]
  11. |;
  12. (defun c:test ()
  13.   (cmdla0)
  14.   (setvar "OSMODE" 0)
  15.   (setq ss (ssget '((0 . "ARC"))) i  -1)
  16.   (while (setq s1 (ssname ss (setq i (1+ i))))
  17.     (setq pm  (xyp-get-CurveMidPoint s1)
  18.     pmm (xyp-get-Midpoint pm (xyp-get-dxf 10 s1)))
  19.     (command "_.dimradius" (list s1 pm) pmm))
  20.   (cmdla1))
发表于 2021-6-18 18:10:35 | 显示全部楼层
  1. (defun tt ()
  2. ;;;求两点间的中点
  3.   (defun mid (p1 p2)
  4.     (mapcar (function (lambda (e1 e2) (* (+ e1 e2) 0.5))) p1 p2)
  5.   )
  6.   (setq en (car (entsel)))
  7.   (setq pt1 (vlax-curve-getStartPoint en))
  8.   (setq pt2 (vlax-curve-getEndPoint en))
  9.   (setq mid_pt (mid pt1 pt2))                ;两点的中点
  10.   (setq mid_pt (vlax-curve-getClosestPointTo en mid_pt)) ;圆弧中点
  11. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-16 18:40 , Processed in 0.244960 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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